{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "03bd465c",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "import math\n",
    "import random \n",
    "import time\n",
    "from sklearn.model_selection import train_test_split"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6d5d67cd",
   "metadata": {},
   "source": [
    "数据预处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "cdff2203",
   "metadata": {},
   "outputs": [],
   "source": [
    "# df=pd.read_csv('E:/推荐系统/数据集/MovieLens/ml-latest/ratings.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "c5b04c90",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "用时：10.192579秒\n"
     ]
    }
   ],
   "source": [
    "#划分训练集测试集\n",
    "'''\n",
    "users_number表示选择的用户数量，train_percent表示训练集比例\n",
    "'''\n",
    "start=time.time()\n",
    "N=0\n",
    "users_number=500\n",
    "training_percent=0.9\n",
    "train=pd.DataFrame(columns=list(df))\n",
    "test=pd.DataFrame(columns=list(df))\n",
    "for user,result in df.groupby('userId'):\n",
    "    result=result.reset_index(drop=True)\n",
    "    time_lst=list(result['timestamp'])\n",
    "    index_train=np.argsort(time_lst)[:int(len(time_lst)*training_percent)]\n",
    "    index_test=np.argsort(time_lst)[int(len(time_lst)*training_percent)+1:]\n",
    "    train=pd.concat([train,result.iloc[index_train]])\n",
    "    test=pd.concat([test,result.iloc[index_test]])\n",
    "    N+=1\n",
    "    if N>users_number:\n",
    "        break\n",
    "train=train.reset_index(drop=True)\n",
    "test=test.reset_index(drop=True)\n",
    "end=time.time()\n",
    "print(\"用时：%f秒\"%(end-start))\n",
    "train['istest']=0\n",
    "test['istest']=1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "ba74074a",
   "metadata": {},
   "outputs": [],
   "source": [
    "test=pd.read_csv('E:/推荐系统/数据集/MovieLens/ml-latest/中间量/评分预测问题_1千用户_test.csv')\n",
    "train=pd.read_csv('E:/推荐系统/数据集/MovieLens/ml-latest/中间量/评分预测问题_1千用户_train.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "7cace429",
   "metadata": {},
   "outputs": [],
   "source": [
    "# print(\"数据集中的电影部数：%d\"%len(df['movieId'].unique()))\n",
    "# print(\"数据集中的用户数：%d\"%len(df['userId'].unique()))\n",
    "# print(\"训练集中的电影部数：%d\"%len(train['movieId'].unique()))\n",
    "# print(\"训练集中的用户数：%d\"%len(train['userId'].unique()))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "0a8e6a8e",
   "metadata": {},
   "outputs": [],
   "source": [
    "'''\n",
    "record：训练集+测试集。\n",
    "'''\n",
    "record=pd.concat([train,test])\n",
    "record=record.reset_index(drop=True)\n",
    "record['pre']=0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "432bd853",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>userId</th>\n",
       "      <th>movieId</th>\n",
       "      <th>rating</th>\n",
       "      <th>timestamp</th>\n",
       "      <th>istest</th>\n",
       "      <th>pre</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>3826</td>\n",
       "      <td>2.0</td>\n",
       "      <td>1256677210</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>307</td>\n",
       "      <td>3.5</td>\n",
       "      <td>1256677221</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>1590</td>\n",
       "      <td>2.5</td>\n",
       "      <td>1256677236</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>2478</td>\n",
       "      <td>4.0</td>\n",
       "      <td>1256677239</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1</td>\n",
       "      <td>3698</td>\n",
       "      <td>3.5</td>\n",
       "      <td>1256677243</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>94978</th>\n",
       "      <td>1000</td>\n",
       "      <td>102993</td>\n",
       "      <td>4.0</td>\n",
       "      <td>1516313264</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>94979</th>\n",
       "      <td>1000</td>\n",
       "      <td>159717</td>\n",
       "      <td>4.0</td>\n",
       "      <td>1516313279</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>94980</th>\n",
       "      <td>1000</td>\n",
       "      <td>89864</td>\n",
       "      <td>3.5</td>\n",
       "      <td>1516313291</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>94981</th>\n",
       "      <td>1000</td>\n",
       "      <td>73860</td>\n",
       "      <td>4.5</td>\n",
       "      <td>1516313299</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>94982</th>\n",
       "      <td>1000</td>\n",
       "      <td>109374</td>\n",
       "      <td>2.5</td>\n",
       "      <td>1534443939</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>94983 rows × 6 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "       userId  movieId  rating   timestamp  istest  pre\n",
       "0           1     3826     2.0  1256677210       0    0\n",
       "1           1      307     3.5  1256677221       0    0\n",
       "2           1     1590     2.5  1256677236       0    0\n",
       "3           1     2478     4.0  1256677239       0    0\n",
       "4           1     3698     3.5  1256677243       0    0\n",
       "...       ...      ...     ...         ...     ...  ...\n",
       "94978    1000   102993     4.0  1516313264       1    0\n",
       "94979    1000   159717     4.0  1516313279       1    0\n",
       "94980    1000    89864     3.5  1516313291       1    0\n",
       "94981    1000    73860     4.5  1516313299       1    0\n",
       "94982    1000   109374     2.5  1534443939       1    0\n",
       "\n",
       "[94983 rows x 6 columns]"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "record"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dbac3903",
   "metadata": {},
   "source": [
    "定义需要函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "44c7a2fe",
   "metadata": {},
   "outputs": [],
   "source": [
    "#初始化P,Q,B_user，B_item向量\n",
    "def InitializePQ(F,all_users_set,all_items_set):\n",
    "    P={user:np.random.randn(F) for user in all_users_set}\n",
    "    Q={item:np.random.randn(F) for item in all_items_set}\n",
    "    B_user={user:0 for user in all_users_set}\n",
    "    B_item={item:0 for item in all_items_set}\n",
    "    return P,Q,B_user,B_item\n",
    "\n",
    "#得到rui的预测值\n",
    "def Predict(P_user,Q_item,bu,bi,u):\n",
    "    '''\n",
    "    P_user:user对应P矩阵中的向量\n",
    "    Q_item:item对应Q矩阵中的向量\n",
    "    bu:用户u的偏置\n",
    "    bi:物品i的偏置\n",
    "    u:全局平均评分\n",
    "    '''\n",
    "    return np.multiply( P_user,Q_item ).sum() + bi + bu + u\n",
    "\n",
    "#评价指标\n",
    "def rmse(rating1,rating2):\n",
    "    #rating2为实际评分，rating1为预测\n",
    "    return (np.sum((rating1 - rating2) ** 2) / len(rating2))**0.5\n",
    "def mae(rating1,rating2):\n",
    "    return abs(np.sum((rating1 - rating2)) / len(rating2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "b7f97506",
   "metadata": {},
   "outputs": [],
   "source": [
    "def validation_predct(validation,P,Q,B_user,B_item,u):\n",
    "    '''\n",
    "    '''\n",
    "    pre_list=[]\n",
    "    true_rating_list=[]\n",
    "    validation_loss=0\n",
    "    \n",
    "    for index,r in validation.groupby(validation.index):\n",
    "        userId=int(r['userId'].values[0])\n",
    "        movieId=int(r['movieId'].values[0])\n",
    "        if (userId not in P)|(movieId not in Q):\n",
    "            continue\n",
    "        else:\n",
    "            pre_list.append(Predict(P[userId],Q[movieId],B_user[userId],B_item[movieId],u))\n",
    "            true_rating_list.append(r['rating'].values[0])\n",
    "            \n",
    "    pre=np.array(pre_list)\n",
    "    true=np.array(true_rating_list)\n",
    "    validation_loss = sum((pre-true)**2)/len(true)\n",
    "    \n",
    "    return validation_loss, rmse(pre,true),mae(pre,true)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "54cd2966",
   "metadata": {},
   "outputs": [],
   "source": [
    "#梯度下降法计算P，Q，B_user,B_item\n",
    "def LatentFactorModel(train,F,alpha,lambda_,steps):\n",
    "    '''\n",
    "    F:隐特征个数\n",
    "    alpha：学习率\n",
    "    lambda_：正则项系数\n",
    "    steps：迭代总次数\n",
    "    all_users_set：训练集所有用户集合\n",
    "    all_items_set：训练集所有物品集合\n",
    "    all_items：训练集所有物品列表，包括重复交互\n",
    "    u：全局评分均值\n",
    "    '''\n",
    "    all_users_set=set(train['userId'])\n",
    "    all_items_set=set(train['movieId'])\n",
    "    P,Q,B_user,B_item=InitializePQ(F,all_users_set,all_items_set)\n",
    "    all_items=list(train['movieId'])\n",
    "    u=np.mean(train['rating'])\n",
    "    train_ = train.drop(index=list((train.sample(frac=0.05,replace=False,random_state=1).index)))\n",
    "    validation = train.sample(frac=0.05,replace=False,random_state=1)\n",
    "    \n",
    "    train_rmse_lst=[]\n",
    "    validation_rmse_lst=[]\n",
    "    train_mae_lst=[]\n",
    "    validation_mae_lst=[]   \n",
    "    \n",
    "    mae_temp=100\n",
    "    for step in range(0,steps):\n",
    "        train_loss=0\n",
    "        for user, result in train_.groupby('userId'): #随机梯度下降          \n",
    "            result=result.reset_index(drop=True)\n",
    "            result=result[['movieId','rating']]\n",
    "            for index in range(result.shape[0]):                              #随机梯度下降方法，每次拿出一个样本和样本标签来更新P和Q中对应的参数\n",
    "                item = result.iloc[index]['movieId']\n",
    "                rui = result.iloc[index]['rating']\n",
    "                eui = rui - Predict(P[user],Q[item],B_user[user],B_item[item],u)\n",
    "                train_loss += eui**2\n",
    "                \n",
    "                #更新参数\n",
    "                P[user] += alpha*( eui*Q[item]-lambda_*P[user] )            #向量化加速\n",
    "                Q[item] += alpha*( eui*P[user]-lambda_*Q[item] )\n",
    "                B_user[user] += alpha*(eui - lambda_*B_user[user])\n",
    "                B_item[item] += alpha*(eui - lambda_*B_item[item])  \n",
    "                \n",
    "        validation_loss,rmse_validation,mae_validation=validation_predct(validation,P,Q,B_user,B_item,u)\n",
    "        \n",
    "        print(\"第%d步训练集损失为：%f\"%(step+1,train_loss/train_.shape[0]))\n",
    "        print(\"第%d步验证集损失为：%f\"%(step+1,validation_loss))\n",
    "        print(\"第%d步验证集rmse为：%f\"%(step+1,rmse_validation))\n",
    "        print(\"第%d步验证集mae为：%f\"%(step+1,mae_validation))\n",
    "        \n",
    "        \n",
    "        if alpha<=0.001:\n",
    "            continue\n",
    "        else:  \n",
    "            alpha*=0.99                                                        #学习率衰减\n",
    "            \n",
    "        \n",
    "        if mae_temp<mae_validation:\n",
    "            break\n",
    "        else:\n",
    "            mae_temp=mae_validation\n",
    "            \n",
    "        train_loss, rmse_train, mae_train = validation_predct(train_,P,Q,B_user,B_item,u)\n",
    "    \n",
    "        train_rmse_lst.append(rmse_train)\n",
    "        validation_rmse_lst.append(rmse_validation)\n",
    "        train_mae_lst.append(mae_train)\n",
    "        validation_mae_lst.append(mae_validation)\n",
    "        \n",
    "    return P,Q,B_user,B_item,u,train_rmse_lst,validation_rmse_lst,train_mae_lst,validation_mae_lst\n",
    "  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "e780072d",
   "metadata": {},
   "outputs": [],
   "source": [
    "#利用训练好的结果对测试集预测\n",
    "def test_predict(record,P,Q,B_user,B_item,u):\n",
    "    start=time.time()\n",
    "    \n",
    "    #其实只预测测试集中的评分即可，不需要预测训练集的评分。但这里对record中每一条行为数据都做出了一个评分。\n",
    "    for index,r in record.groupby(record.index):\n",
    "        userId=int(r['userId'].values[0])\n",
    "        movieId=int(r['movieId'].values[0])\n",
    "        if userId not in P:\n",
    "            print(\"无法对用户%d关于电影的评分%d做出预测，因为训练集中没有该用户数据\"%(userId,movieId))\n",
    "            continue\n",
    "        if movieId not in Q:\n",
    "            print(\"无法对用户%d关于电影的评分%d做出预测，因为训练集中没有该物品数据\"%(userId,movieId))\n",
    "            continue\n",
    "        record.loc[index,'pre']=Predict(P[userId],Q[movieId],B_user[userId],B_item[movieId],u)\n",
    "    end=time.time()\n",
    "    print(\"用时%f秒\"%(end-start))\n",
    "    \n",
    "    #提取出测试集部分，根据预测结果计算评价指标\n",
    "    record_test=record[record['istest']==1].copy()\n",
    "    print(\"RMSE为：%.5f\"%rmse(record_test['pre'],record_test['rating']))\n",
    "    print(\"MAE为：%.5f\"%mae(record_test['pre'],record_test['rating']))\n",
    "    return record_test"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "6428cfed",
   "metadata": {},
   "outputs": [],
   "source": [
    "def LatentFactorModel_continue(train,F,alpha,lambda_,steps,P,Q,B_user,B_item,u):\n",
    "    '''\n",
    "    F:隐特征个数\n",
    "    alpha：学习率\n",
    "    lambda_：正则项系数\n",
    "    steps：迭代总次数\n",
    "    u：全局评分均值\n",
    "    '''\n",
    "    u=np.mean(train['rating'])\n",
    "    \n",
    "    for step in range(0,steps):\n",
    "        err_sum=0\n",
    "        for user, result in train.groupby('userId'): #随机梯度下降          \n",
    "            result=result.reset_index(drop=True)\n",
    "            result=result[['movieId','rating']]\n",
    "            for index in range(result.shape[0]):                              #随机梯度下降方法，每次拿出一个样本和样本标签来更新P和Q中对应的参数\n",
    "                item = result.iloc[index]['movieId']\n",
    "                rui = result.iloc[index]['rating']\n",
    "                eui = rui - Predict(P[user],Q[item],B_user[user],B_item[item],u)\n",
    "                err_sum += eui**2\n",
    "                \n",
    "                #更新参数\n",
    "                P[user] += alpha*( eui*Q[item]-lambda_*P[user] )            #向量化加速\n",
    "                Q[item] += alpha*( eui*P[user]-lambda_*Q[item] )\n",
    "                B_user[user] += alpha*(eui - lambda_*B_user[user])\n",
    "                B_item[item] += alpha*(eui - lambda_*B_item[item])\n",
    "                \n",
    "        print(\"第%d步损失为：%f\"%(step+1,err_sum))\n",
    "        alpha*=0.9                                                        #学习率衰减\n",
    "    return P,Q,B_user,B_item,u"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "735cf18d",
   "metadata": {},
   "source": [
    "训练PQ，预测"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "2bbe9a61",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "第1步训练集损失为：6.587945\n",
      "第1步验证集损失为：3.343941\n",
      "第1步验证集rmse为：1.828645\n",
      "第1步验证集mae为：0.060739\n",
      "第2步训练集损失为：1.628401\n",
      "第2步验证集损失为：2.617961\n",
      "第2步验证集rmse为：1.618011\n",
      "第2步验证集mae为：0.051998\n",
      "第3步训练集损失为：1.144981\n",
      "第3步验证集损失为：2.344372\n",
      "第3步验证集rmse为：1.531134\n",
      "第3步验证集mae为：0.048252\n",
      "第4步训练集损失为：0.963054\n",
      "第4步验证集损失为：2.199859\n",
      "第4步验证集rmse为：1.483192\n",
      "第4步验证集mae为：0.045631\n",
      "第5步训练集损失为：0.870555\n",
      "第5步验证集损失为：2.110659\n",
      "第5步验证集rmse为：1.452811\n",
      "第5步验证集mae为：0.043593\n",
      "第6步训练集损失为：0.814926\n",
      "第6步验证集损失为：2.050332\n",
      "第6步验证集rmse为：1.431898\n",
      "第6步验证集mae为：0.041925\n",
      "第7步训练集损失为：0.777546\n",
      "第7步验证集损失为：2.006986\n",
      "第7步验证集rmse为：1.416682\n",
      "第7步验证集mae为：0.040510\n",
      "第8步训练集损失为：0.750363\n",
      "第8步验证集损失为：1.974457\n",
      "第8步验证集rmse为：1.405154\n",
      "第8步验证集mae为：0.039273\n",
      "第9步训练集损失为：0.729399\n",
      "第9步验证集损失为：1.949222\n",
      "第9步验证集rmse为：1.396145\n",
      "第9步验证集mae为：0.038163\n",
      "第10步训练集损失为：0.712486\n",
      "第10步验证集损失为：1.929122\n",
      "第10步验证集rmse为：1.388928\n",
      "第10步验证集mae为：0.037147\n",
      "第11步训练集损失为：0.698356\n",
      "第11步验证集损失为：1.912759\n",
      "第11步验证集rmse为：1.383025\n",
      "第11步验证集mae为：0.036200\n",
      "第12步训练集损失为：0.686219\n",
      "第12步验证集损失为：1.899191\n",
      "第12步验证集rmse为：1.378111\n",
      "第12步验证集mae为：0.035307\n",
      "第13步训练集损失为：0.675561\n",
      "第13步验证集损失为：1.887758\n",
      "第13步验证集rmse为：1.373957\n",
      "第13步验证集mae为：0.034456\n",
      "第14步训练集损失为：0.666034\n",
      "第14步验证集损失为：1.877988\n",
      "第14步验证集rmse为：1.370397\n",
      "第14步验证集mae为：0.033640\n",
      "第15步训练集损失为：0.657394\n",
      "第15步验证集损失为：1.869532\n",
      "第15步验证集rmse为：1.367308\n",
      "第15步验证集mae为：0.032852\n",
      "第16步训练集损失为：0.649464\n",
      "第16步验证集损失为：1.862129\n",
      "第16步验证集rmse为：1.364598\n",
      "第16步验证集mae为：0.032089\n",
      "第17步训练集损失为：0.642116\n",
      "第17步验证集损失为：1.855580\n",
      "第17步验证集rmse为：1.362197\n",
      "第17步验证集mae为：0.031348\n",
      "第18步训练集损失为：0.635250\n",
      "第18步验证集损失为：1.849729\n",
      "第18步验证集rmse为：1.360047\n",
      "第18步验证集mae为：0.030627\n",
      "第19步训练集损失为：0.628792\n",
      "第19步验证集损失为：1.844456\n",
      "第19步验证集rmse为：1.358108\n",
      "第19步验证集mae为：0.029923\n",
      "第20步训练集损失为：0.622682\n",
      "第20步验证集损失为：1.839665\n",
      "第20步验证集rmse为：1.356342\n",
      "第20步验证集mae为：0.029236\n",
      "第21步训练集损失为：0.616874\n",
      "第21步验证集损失为：1.835278\n",
      "第21步验证集rmse为：1.354724\n",
      "第21步验证集mae为：0.028565\n",
      "第22步训练集损失为：0.611330\n",
      "第22步验证集损失为：1.831234\n",
      "第22步验证集rmse为：1.353231\n",
      "第22步验证集mae为：0.027910\n",
      "第23步训练集损失为：0.606019\n",
      "第23步验证集损失为：1.827482\n",
      "第23步验证集rmse为：1.351844\n",
      "第23步验证集mae为：0.027268\n",
      "第24步训练集损失为：0.600915\n",
      "第24步验证集损失为：1.823982\n",
      "第24步验证集rmse为：1.350549\n",
      "第24步验证集mae为：0.026640\n",
      "第25步训练集损失为：0.595998\n",
      "第25步验证集损失为：1.820699\n",
      "第25步验证集rmse为：1.349333\n",
      "第25步验证集mae为：0.026026\n",
      "第26步训练集损失为：0.591249\n",
      "第26步验证集损失为：1.817606\n",
      "第26步验证集rmse为：1.348186\n",
      "第26步验证集mae为：0.025424\n",
      "第27步训练集损失为：0.586654\n",
      "第27步验证集损失为：1.814679\n",
      "第27步验证集rmse为：1.347100\n",
      "第27步验证集mae为：0.024834\n",
      "第28步训练集损失为：0.582200\n",
      "第28步验证集损失为：1.811898\n",
      "第28步验证集rmse为：1.346068\n",
      "第28步验证集mae为：0.024256\n",
      "第29步训练集损失为：0.577875\n",
      "第29步验证集损失为：1.809249\n",
      "第29步验证集rmse为：1.345083\n",
      "第29步验证集mae为：0.023690\n",
      "第30步训练集损失为：0.573670\n",
      "第30步验证集损失为：1.806716\n",
      "第30步验证集rmse为：1.344141\n",
      "第30步验证集mae为：0.023134\n",
      "第31步训练集损失为：0.569576\n",
      "第31步验证集损失为：1.804288\n",
      "第31步验证集rmse为：1.343238\n",
      "第31步验证集mae为：0.022589\n",
      "第32步训练集损失为：0.565586\n",
      "第32步验证集损失为：1.801955\n",
      "第32步验证集rmse为：1.342369\n",
      "第32步验证集mae为：0.022054\n",
      "第33步训练集损失为：0.561695\n",
      "第33步验证集损失为：1.799708\n",
      "第33步验证集rmse为：1.341532\n",
      "第33步验证集mae为：0.021528\n",
      "第34步训练集损失为：0.557895\n",
      "第34步验证集损失为：1.797541\n",
      "第34步验证集rmse为：1.340724\n",
      "第34步验证集mae为：0.021012\n",
      "第35步训练集损失为：0.554182\n",
      "第35步验证集损失为：1.795446\n",
      "第35步验证集rmse为：1.339943\n",
      "第35步验证集mae为：0.020505\n",
      "第36步训练集损失为：0.550551\n",
      "第36步验证集损失为：1.793419\n",
      "第36步验证集rmse为：1.339186\n",
      "第36步验证集mae为：0.020006\n",
      "第37步训练集损失为：0.546999\n",
      "第37步验证集损失为：1.791453\n",
      "第37步验证集rmse为：1.338452\n",
      "第37步验证集mae为：0.019515\n",
      "第38步训练集损失为：0.543522\n",
      "第38步验证集损失为：1.789546\n",
      "第38步验证集rmse为：1.337739\n",
      "第38步验证集mae为：0.019032\n",
      "第39步训练集损失为：0.540116\n",
      "第39步验证集损失为：1.787693\n",
      "第39步验证集rmse为：1.337046\n",
      "第39步验证集mae为：0.018557\n",
      "第40步训练集损失为：0.536778\n",
      "第40步验证集损失为：1.785890\n",
      "第40步验证集rmse为：1.336372\n",
      "第40步验证集mae为：0.018088\n",
      "第41步训练集损失为：0.533506\n",
      "第41步验证集损失为：1.784135\n",
      "第41步验证集rmse为：1.335715\n",
      "第41步验证集mae为：0.017626\n",
      "第42步训练集损失为：0.530296\n",
      "第42步验证集损失为：1.782426\n",
      "第42步验证集rmse为：1.335075\n",
      "第42步验证集mae为：0.017171\n",
      "第43步训练集损失为：0.527148\n",
      "第43步验证集损失为：1.780759\n",
      "第43步验证集rmse为：1.334451\n",
      "第43步验证集mae为：0.016721\n",
      "第44步训练集损失为：0.524058\n",
      "第44步验证集损失为：1.779133\n",
      "第44步验证集rmse为：1.333841\n",
      "第44步验证集mae为：0.016277\n",
      "第45步训练集损失为：0.521024\n",
      "第45步验证集损失为：1.777546\n",
      "第45步验证集rmse为：1.333246\n",
      "第45步验证集mae为：0.015839\n",
      "第46步训练集损失为：0.518046\n",
      "第46步验证集损失为：1.775995\n",
      "第46步验证集rmse为：1.332665\n",
      "第46步验证集mae为：0.015405\n",
      "第47步训练集损失为：0.515120\n",
      "第47步验证集损失为：1.774481\n",
      "第47步验证集rmse为：1.332096\n",
      "第47步验证集mae为：0.014977\n",
      "第48步训练集损失为：0.512245\n",
      "第48步验证集损失为：1.773000\n",
      "第48步验证集rmse为：1.331540\n",
      "第48步验证集mae为：0.014553\n",
      "第49步训练集损失为：0.509419\n",
      "第49步验证集损失为：1.771552\n",
      "第49步验证集rmse为：1.330997\n",
      "第49步验证集mae为：0.014133\n",
      "第50步训练集损失为：0.506642\n",
      "第50步验证集损失为：1.770136\n",
      "第50步验证集rmse为：1.330465\n",
      "第50步验证集mae为：0.013718\n",
      "第51步训练集损失为：0.503912\n",
      "第51步验证集损失为：1.768751\n",
      "第51步验证集rmse为：1.329944\n",
      "第51步验证集mae为：0.013306\n",
      "第52步训练集损失为：0.501227\n",
      "第52步验证集损失为：1.767395\n",
      "第52步验证集rmse为：1.329434\n",
      "第52步验证集mae为：0.012898\n",
      "第53步训练集损失为：0.498587\n",
      "第53步验证集损失为：1.766068\n",
      "第53步验证集rmse为：1.328935\n",
      "第53步验证集mae为：0.012494\n",
      "第54步训练集损失为：0.495989\n",
      "第54步验证集损失为：1.764769\n",
      "第54步验证集rmse为：1.328446\n",
      "第54步验证集mae为：0.012093\n",
      "第55步训练集损失为：0.493434\n",
      "第55步验证集损失为：1.763498\n",
      "第55步验证集rmse为：1.327968\n",
      "第55步验证集mae为：0.011694\n",
      "第56步训练集损失为：0.490919\n",
      "第56步验证集损失为：1.762253\n",
      "第56步验证集rmse为：1.327499\n",
      "第56步验证集mae为：0.011299\n",
      "第57步训练集损失为：0.488444\n",
      "第57步验证集损失为：1.761034\n",
      "第57步验证集rmse为：1.327040\n",
      "第57步验证集mae为：0.010906\n",
      "第58步训练集损失为：0.486008\n",
      "第58步验证集损失为：1.759841\n",
      "第58步验证集rmse为：1.326590\n",
      "第58步验证集mae为：0.010516\n",
      "第59步训练集损失为：0.483610\n",
      "第59步验证集损失为：1.758673\n",
      "第59步验证集rmse为：1.326150\n",
      "第59步验证集mae为：0.010129\n",
      "第60步训练集损失为：0.481249\n",
      "第60步验证集损失为：1.757529\n",
      "第60步验证集rmse为：1.325718\n",
      "第60步验证集mae为：0.009744\n",
      "第61步训练集损失为：0.478924\n",
      "第61步验证集损失为：1.756409\n",
      "第61步验证集rmse为：1.325296\n",
      "第61步验证集mae为：0.009361\n",
      "第62步训练集损失为：0.476634\n",
      "第62步验证集损失为：1.755313\n",
      "第62步验证集rmse为：1.324882\n",
      "第62步验证集mae为：0.008980\n",
      "第63步训练集损失为：0.474380\n",
      "第63步验证集损失为：1.754240\n",
      "第63步验证集rmse为：1.324477\n",
      "第63步验证集mae为：0.008601\n",
      "第64步训练集损失为：0.472159\n",
      "第64步验证集损失为：1.753189\n",
      "第64步验证集rmse为：1.324080\n",
      "第64步验证集mae为：0.008224\n",
      "第65步训练集损失为：0.469971\n",
      "第65步验证集损失为：1.752160\n",
      "第65步验证集rmse为：1.323692\n",
      "第65步验证集mae为：0.007849\n",
      "第66步训练集损失为：0.467815\n",
      "第66步验证集损失为：1.751154\n",
      "第66步验证集rmse为：1.323312\n",
      "第66步验证集mae为：0.007475\n",
      "第67步训练集损失为：0.465692\n",
      "第67步验证集损失为：1.750169\n",
      "第67步验证集rmse为：1.322939\n",
      "第67步验证集mae为：0.007104\n",
      "第68步训练集损失为：0.463599\n",
      "第68步验证集损失为：1.749204\n",
      "第68步验证集rmse为：1.322575\n",
      "第68步验证集mae为：0.006734\n",
      "第69步训练集损失为：0.461538\n",
      "第69步验证集损失为：1.748261\n",
      "第69步验证集rmse为：1.322218\n",
      "第69步验证集mae为：0.006365\n",
      "第70步训练集损失为：0.459506\n",
      "第70步验证集损失为：1.747338\n",
      "第70步验证集rmse为：1.321869\n",
      "第70步验证集mae为：0.005998\n",
      "第71步训练集损失为：0.457503\n",
      "第71步验证集损失为：1.746435\n",
      "第71步验证集rmse为：1.321528\n",
      "第71步验证集mae为：0.005633\n",
      "第72步训练集损失为：0.455530\n",
      "第72步验证集损失为：1.745552\n",
      "第72步验证集rmse为：1.321193\n",
      "第72步验证集mae为：0.005269\n",
      "第73步训练集损失为：0.453584\n",
      "第73步验证集损失为：1.744688\n",
      "第73步验证集rmse为：1.320866\n",
      "第73步验证集mae为：0.004907\n",
      "第74步训练集损失为：0.451667\n",
      "第74步验证集损失为：1.743842\n",
      "第74步验证集rmse为：1.320546\n",
      "第74步验证集mae为：0.004546\n",
      "第75步训练集损失为：0.449776\n",
      "第75步验证集损失为：1.743016\n",
      "第75步验证集rmse为：1.320233\n",
      "第75步验证集mae为：0.004186\n",
      "第76步训练集损失为：0.447913\n",
      "第76步验证集损失为：1.742207\n",
      "第76步验证集rmse为：1.319927\n",
      "第76步验证集mae为：0.003828\n",
      "第77步训练集损失为：0.446076\n",
      "第77步验证集损失为：1.741417\n",
      "第77步验证集rmse为：1.319628\n",
      "第77步验证集mae为：0.003472\n",
      "第78步训练集损失为：0.444264\n",
      "第78步验证集损失为：1.740644\n",
      "第78步验证集rmse为：1.319335\n",
      "第78步验证集mae为：0.003117\n",
      "第79步训练集损失为：0.442479\n",
      "第79步验证集损失为：1.739888\n",
      "第79步验证集rmse为：1.319048\n",
      "第79步验证集mae为：0.002763\n",
      "第80步训练集损失为：0.440718\n",
      "第80步验证集损失为：1.739149\n",
      "第80步验证集rmse为：1.318768\n",
      "第80步验证集mae为：0.002411\n",
      "第81步训练集损失为：0.438981\n",
      "第81步验证集损失为：1.738427\n",
      "第81步验证集rmse为：1.318494\n",
      "第81步验证集mae为：0.002060\n",
      "第82步训练集损失为：0.437269\n",
      "第82步验证集损失为：1.737720\n",
      "第82步验证集rmse为：1.318226\n",
      "第82步验证集mae为：0.001711\n",
      "第83步训练集损失为：0.435580\n",
      "第83步验证集损失为：1.737030\n",
      "第83步验证集rmse为：1.317964\n",
      "第83步验证集mae为：0.001363\n",
      "第84步训练集损失为：0.433915\n",
      "第84步验证集损失为：1.736354\n",
      "第84步验证集rmse为：1.317708\n",
      "第84步验证集mae为：0.001017\n",
      "第85步训练集损失为：0.432273\n",
      "第85步验证集损失为：1.735694\n",
      "第85步验证集rmse为：1.317458\n",
      "第85步验证集mae为：0.000672\n",
      "第86步训练集损失为：0.430653\n",
      "第86步验证集损失为：1.735049\n",
      "第86步验证集rmse为：1.317213\n",
      "第86步验证集mae为：0.000329\n",
      "第87步训练集损失为：0.429056\n",
      "第87步验证集损失为：1.734418\n",
      "第87步验证集rmse为：1.316973\n",
      "第87步验证集mae为：0.000013\n",
      "第88步训练集损失为：0.427480\n",
      "第88步验证集损失为：1.733801\n",
      "第88步验证集rmse为：1.316739\n",
      "第88步验证集mae为：0.000353\n",
      "用时:2276.556159秒\n"
     ]
    }
   ],
   "source": [
    "start=time.time()\n",
    "P,Q,B_user,B_item,u,train_rmse_lst,validation_rmse_lst,train_mae_lst,validation_mae_lst=LatentFactorModel(train,20,0.01,0.01,3000)\n",
    "end=time.time()\n",
    "print(\"用时:%f秒\"%(end-start))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "dd79b553",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "无法对用户4关于电影的评分43708做出预测，因为训练集中没有该物品数据\n",
      "无法对用户4关于电影的评分26819做出预测，因为训练集中没有该物品数据\n",
      "无法对用户4关于电影的评分26870做出预测，因为训练集中没有该物品数据\n",
      "无法对用户8关于电影的评分1317做出预测，因为训练集中没有该物品数据\n",
      "无法对用户14关于电影的评分166024做出预测，因为训练集中没有该物品数据\n",
      "无法对用户19关于电影的评分545做出预测，因为训练集中没有该物品数据\n",
      "无法对用户48关于电影的评分156387做出预测，因为训练集中没有该物品数据\n",
      "无法对用户51关于电影的评分1317做出预测，因为训练集中没有该物品数据\n",
      "无法对用户54关于电影的评分1426做出预测，因为训练集中没有该物品数据\n",
      "无法对用户55关于电影的评分5765做出预测，因为训练集中没有该物品数据\n",
      "无法对用户55关于电影的评分3759做出预测，因为训练集中没有该物品数据\n",
      "无法对用户56关于电影的评分6220做出预测，因为训练集中没有该物品数据\n",
      "无法对用户56关于电影的评分89780做出预测，因为训练集中没有该物品数据\n",
      "无法对用户56关于电影的评分82242做出预测，因为训练集中没有该物品数据\n",
      "无法对用户71关于电影的评分26587做出预测，因为训练集中没有该物品数据\n",
      "无法对用户71关于电影的评分34542做出预测，因为训练集中没有该物品数据\n",
      "无法对用户71关于电影的评分40586做出预测，因为训练集中没有该物品数据\n",
      "无法对用户73关于电影的评分5515做出预测，因为训练集中没有该物品数据\n",
      "无法对用户73关于电影的评分98795做出预测，因为训练集中没有该物品数据\n",
      "无法对用户73关于电影的评分111757做出预测，因为训练集中没有该物品数据\n",
      "无法对用户81关于电影的评分82143做出预测，因为训练集中没有该物品数据\n",
      "无法对用户81关于电影的评分80185做出预测，因为训练集中没有该物品数据\n",
      "无法对用户81关于电影的评分85312做出预测，因为训练集中没有该物品数据\n",
      "无法对用户81关于电影的评分118244做出预测，因为训练集中没有该物品数据\n",
      "无法对用户83关于电影的评分641做出预测，因为训练集中没有该物品数据\n",
      "无法对用户83关于电影的评分201做出预测，因为训练集中没有该物品数据\n",
      "无法对用户83关于电影的评分754做出预测，因为训练集中没有该物品数据\n",
      "无法对用户88关于电影的评分74156做出预测，因为训练集中没有该物品数据\n",
      "无法对用户95关于电影的评分2238做出预测，因为训练集中没有该物品数据\n",
      "无法对用户95关于电影的评分6884做出预测，因为训练集中没有该物品数据\n",
      "无法对用户95关于电影的评分6762做出预测，因为训练集中没有该物品数据\n",
      "无法对用户95关于电影的评分7745做出预测，因为训练集中没有该物品数据\n",
      "无法对用户97关于电影的评分79318做出预测，因为训练集中没有该物品数据\n",
      "无法对用户99关于电影的评分141420做出预测，因为训练集中没有该物品数据\n",
      "无法对用户99关于电影的评分108506做出预测，因为训练集中没有该物品数据\n",
      "无法对用户103关于电影的评分1720做出预测，因为训练集中没有该物品数据\n",
      "无法对用户105关于电影的评分6523做出预测，因为训练集中没有该物品数据\n",
      "无法对用户105关于电影的评分6518做出预测，因为训练集中没有该物品数据\n",
      "无法对用户105关于电影的评分6464做出预测，因为训练集中没有该物品数据\n",
      "无法对用户119关于电影的评分7068做出预测，因为训练集中没有该物品数据\n",
      "无法对用户119关于电影的评分55207做出预测，因为训练集中没有该物品数据\n",
      "无法对用户134关于电影的评分160563做出预测，因为训练集中没有该物品数据\n",
      "无法对用户134关于电影的评分138212做出预测，因为训练集中没有该物品数据\n",
      "无法对用户134关于电影的评分8811做出预测，因为训练集中没有该物品数据\n",
      "无法对用户134关于电影的评分33681做出预测，因为训练集中没有该物品数据\n",
      "无法对用户134关于电影的评分5597做出预测，因为训练集中没有该物品数据\n",
      "无法对用户134关于电影的评分7012做出预测，因为训练集中没有该物品数据\n",
      "无法对用户134关于电影的评分7986做出预测，因为训练集中没有该物品数据\n",
      "无法对用户134关于电影的评分4497做出预测，因为训练集中没有该物品数据\n",
      "无法对用户134关于电影的评分4092做出预测，因为训练集中没有该物品数据\n",
      "无法对用户134关于电影的评分9004做出预测，因为训练集中没有该物品数据\n",
      "无法对用户134关于电影的评分5764做出预测，因为训练集中没有该物品数据\n",
      "无法对用户134关于电影的评分26124做出预测，因为训练集中没有该物品数据\n",
      "无法对用户134关于电影的评分27003做出预测，因为训练集中没有该物品数据\n",
      "无法对用户134关于电影的评分63826做出预测，因为训练集中没有该物品数据\n",
      "无法对用户138关于电影的评分6720做出预测，因为训练集中没有该物品数据\n",
      "无法对用户151关于电影的评分6211做出预测，因为训练集中没有该物品数据\n",
      "无法对用户151关于电影的评分49951做出预测，因为训练集中没有该物品数据\n",
      "无法对用户151关于电影的评分140866做出预测，因为训练集中没有该物品数据\n",
      "无法对用户151关于电影的评分140868做出预测，因为训练集中没有该物品数据\n",
      "无法对用户151关于电影的评分136908做出预测，因为训练集中没有该物品数据\n",
      "无法对用户151关于电影的评分107649做出预测，因为训练集中没有该物品数据\n",
      "无法对用户151关于电影的评分140872做出预测，因为训练集中没有该物品数据\n",
      "无法对用户151关于电影的评分140880做出预测，因为训练集中没有该物品数据\n",
      "无法对用户151关于电影的评分6878做出预测，因为训练集中没有该物品数据\n",
      "无法对用户160关于电影的评分1806做出预测，因为训练集中没有该物品数据\n",
      "无法对用户160关于电影的评分6840做出预测，因为训练集中没有该物品数据\n",
      "无法对用户164关于电影的评分75做出预测，因为训练集中没有该物品数据\n",
      "无法对用户165关于电影的评分298做出预测，因为训练集中没有该物品数据\n",
      "无法对用户165关于电影的评分124做出预测，因为训练集中没有该物品数据\n",
      "无法对用户165关于电影的评分148做出预测，因为训练集中没有该物品数据\n",
      "无法对用户172关于电影的评分94969做出预测，因为训练集中没有该物品数据\n",
      "无法对用户172关于电影的评分98956做出预测，因为训练集中没有该物品数据\n",
      "无法对用户173关于电影的评分91325做出预测，因为训练集中没有该物品数据\n",
      "无法对用户173关于电影的评分74156做出预测，因为训练集中没有该物品数据\n",
      "无法对用户173关于电影的评分145935做出预测，因为训练集中没有该物品数据\n",
      "无法对用户173关于电影的评分93475做出预测，因为训练集中没有该物品数据\n",
      "无法对用户173关于电影的评分133383做出预测，因为训练集中没有该物品数据\n",
      "无法对用户173关于电影的评分122884做出预测，因为训练集中没有该物品数据\n",
      "无法对用户173关于电影的评分138210做出预测，因为训练集中没有该物品数据\n",
      "无法对用户173关于电影的评分155625做出预测，因为训练集中没有该物品数据\n",
      "无法对用户173关于电影的评分159061做出预测，因为训练集中没有该物品数据\n",
      "无法对用户173关于电影的评分160573做出预测，因为训练集中没有该物品数据\n",
      "无法对用户173关于电影的评分165101做出预测，因为训练集中没有该物品数据\n",
      "无法对用户173关于电影的评分160563做出预测，因为训练集中没有该物品数据\n",
      "无法对用户173关于电影的评分163937做出预测，因为训练集中没有该物品数据\n",
      "无法对用户173关于电影的评分93819做出预测，因为训练集中没有该物品数据\n",
      "无法对用户173关于电影的评分145070做出预测，因为训练集中没有该物品数据\n",
      "无法对用户173关于电影的评分156387做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影的评分175519做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影的评分166918做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影的评分170403做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影的评分170809做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影的评分161127做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影的评分131170做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影的评分76087做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影的评分165347做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影的评分155078做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影的评分130784做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影的评分127188做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影的评分121143做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影的评分157340做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影的评分167036做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影的评分177763做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影的评分177497做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影的评分157318做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影的评分158027做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影的评分170645做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影的评分184471做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影的评分178421做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影的评分152061做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影的评分174371做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影的评分166544做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影的评分187601做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影的评分105742做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影的评分56022做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影的评分162322做出预测，因为训练集中没有该物品数据\n",
      "无法对用户176关于电影的评分147942做出预测，因为训练集中没有该物品数据\n",
      "无法对用户182关于电影的评分59333做出预测，因为训练集中没有该物品数据\n",
      "无法对用户187关于电影的评分3118做出预测，因为训练集中没有该物品数据\n",
      "无法对用户196关于电影的评分6311做出预测，因为训练集中没有该物品数据\n",
      "无法对用户206关于电影的评分167842做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影的评分152065做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影的评分105364做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影的评分111661做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影的评分74156做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影的评分163508做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影的评分169992做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影的评分161954做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影的评分163959做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影的评分91416做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影的评分176921做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影的评分167426做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影的评分169068做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影的评分165179做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影的评分173141做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影的评分150284做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影的评分163068做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影的评分5506做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影的评分103721做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影的评分177689做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影的评分180297做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影的评分182379做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影的评分130578做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影的评分181315做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影的评分128620做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影的评分163134做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影的评分134796做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影的评分104636做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影的评分138210做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影的评分167794做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影的评分173369做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影的评分183897做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影的评分183161做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影的评分185029做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影的评分179133做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影的评分179119做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影的评分100272做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影的评分32707做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影的评分6961做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影的评分175813做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影的评分179111做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影的评分127108做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影的评分180451做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影的评分189333做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影的评分177651做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影的评分188213做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影的评分118246做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影的评分179135做出预测，因为训练集中没有该物品数据\n",
      "无法对用户214关于电影的评分178401做出预测，因为训练集中没有该物品数据\n",
      "无法对用户218关于电影的评分476做出预测，因为训练集中没有该物品数据\n",
      "无法对用户222关于电影的评分62277做出预测，因为训练集中没有该物品数据\n",
      "无法对用户227关于电影的评分26322做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影的评分6727做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影的评分6665做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影的评分5764做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影的评分5745做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影的评分5801做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影的评分5830做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影的评分5864做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影的评分4373做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影的评分6109做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影的评分2689做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影的评分6568做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影的评分7386做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影的评分6596做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影的评分6946做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影的评分7389做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影的评分1313做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影的评分6563做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影的评分7917做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影的评分8149做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影的评分8121做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影的评分7995做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影的评分7983做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影的评分7959做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影的评分7817做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影的评分7815做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影的评分7813做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影的评分7614做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影的评分7474做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影的评分7478做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影的评分7442做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影的评分7304做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影的评分7236做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影的评分7128做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影的评分7068做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影的评分7060做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影的评分8585做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影的评分7155做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影的评分1144做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影的评分6710做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影的评分1780做出预测，因为训练集中没有该物品数据\n",
      "无法对用户235关于电影的评分6375做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影的评分5730做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影的评分5705做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影的评分5731做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影的评分5701做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影的评分5694做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影的评分5689做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影的评分5843做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影的评分5845做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影的评分5827做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影的评分5935做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影的评分5930做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影的评分5927做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影的评分5926做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影的评分5919做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影的评分5961做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影的评分5988做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影的评分4656做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影的评分5011做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影的评分6033做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影的评分6038做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影的评分6036做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影的评分868做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影的评分3432做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影的评分6115做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影的评分6153做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影的评分6106做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影的评分6180做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影的评分6178做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影的评分6177做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影的评分6173做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影的评分6179做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影的评分6240做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影的评分6275做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影的评分6313做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影的评分6321做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影的评分6320做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影的评分6319做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影的评分6308做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影的评分6309做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影的评分6312做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影的评分6315做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影的评分6346做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影的评分6348做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影的评分6198做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影的评分6102做出预测，因为训练集中没有该物品数据\n",
      "无法对用户239关于电影的评分6430做出预测，因为训练集中没有该物品数据\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "无法对用户239关于电影的评分6396做出预测，因为训练集中没有该物品数据\n",
      "无法对用户241关于电影的评分1442做出预测，因为训练集中没有该物品数据\n",
      "无法对用户243关于电影的评分25934做出预测，因为训练集中没有该物品数据\n",
      "无法对用户247关于电影的评分73572做出预测，因为训练集中没有该物品数据\n",
      "无法对用户248关于电影的评分109243做出预测，因为训练集中没有该物品数据\n",
      "无法对用户248关于电影的评分133782做出预测，因为训练集中没有该物品数据\n",
      "无法对用户248关于电影的评分174909做出预测，因为训练集中没有该物品数据\n",
      "无法对用户248关于电影的评分179345做出预测，因为训练集中没有该物品数据\n",
      "无法对用户248关于电影的评分177231做出预测，因为训练集中没有该物品数据\n",
      "无法对用户248关于电影的评分183897做出预测，因为训练集中没有该物品数据\n",
      "无法对用户249关于电影的评分4240做出预测，因为训练集中没有该物品数据\n",
      "无法对用户249关于电影的评分4077做出预测，因为训练集中没有该物品数据\n",
      "无法对用户249关于电影的评分4313做出预测，因为训练集中没有该物品数据\n",
      "无法对用户250关于电影的评分8033做出预测，因为训练集中没有该物品数据\n",
      "无法对用户255关于电影的评分3078做出预测，因为训练集中没有该物品数据\n",
      "无法对用户263关于电影的评分7155做出预测，因为训练集中没有该物品数据\n",
      "无法对用户268关于电影的评分6234做出预测，因为训练集中没有该物品数据\n",
      "无法对用户268关于电影的评分7168做出预测，因为训练集中没有该物品数据\n",
      "无法对用户268关于电影的评分6247做出预测，因为训练集中没有该物品数据\n",
      "无法对用户277关于电影的评分81312做出预测，因为训练集中没有该物品数据\n",
      "无法对用户277关于电影的评分53143做出预测，因为训练集中没有该物品数据\n",
      "无法对用户277关于电影的评分6684做出预测，因为训练集中没有该物品数据\n",
      "无法对用户277关于电影的评分47904做出预测，因为训练集中没有该物品数据\n",
      "无法对用户277关于电影的评分44100做出预测，因为训练集中没有该物品数据\n",
      "无法对用户277关于电影的评分131451做出预测，因为训练集中没有该物品数据\n",
      "无法对用户277关于电影的评分6460做出预测，因为训练集中没有该物品数据\n",
      "无法对用户277关于电影的评分61697做出预测，因为训练集中没有该物品数据\n",
      "无法对用户277关于电影的评分38701做出预测，因为训练集中没有该物品数据\n",
      "无法对用户277关于电影的评分51418做出预测，因为训练集中没有该物品数据\n",
      "无法对用户288关于电影的评分3808做出预测，因为训练集中没有该物品数据\n",
      "无法对用户295关于电影的评分71730做出预测，因为训练集中没有该物品数据\n",
      "无法对用户295关于电影的评分7983做出预测，因为训练集中没有该物品数据\n",
      "无法对用户295关于电影的评分49220做出预测，因为训练集中没有该物品数据\n",
      "无法对用户300关于电影的评分4939做出预测，因为训练集中没有该物品数据\n",
      "无法对用户301关于电影的评分5864做出预测，因为训练集中没有该物品数据\n",
      "无法对用户301关于电影的评分6991做出预测，因为训练集中没有该物品数据\n",
      "无法对用户319关于电影的评分2101做出预测，因为训练集中没有该物品数据\n",
      "无法对用户321关于电影的评分43983做出预测，因为训练集中没有该物品数据\n",
      "无法对用户321关于电影的评分163134做出预测，因为训练集中没有该物品数据\n",
      "无法对用户321关于电影的评分176103做出预测，因为训练集中没有该物品数据\n",
      "无法对用户321关于电影的评分177763做出预测，因为训练集中没有该物品数据\n",
      "无法对用户321关于电影的评分56931做出预测，因为训练集中没有该物品数据\n",
      "无法对用户321关于电影的评分189363做出预测，因为训练集中没有该物品数据\n",
      "无法对用户332关于电影的评分26198做出预测，因为训练集中没有该物品数据\n",
      "无法对用户332关于电影的评分4676做出预测，因为训练集中没有该物品数据\n",
      "无法对用户332关于电影的评分3501做出预测，因为训练集中没有该物品数据\n",
      "无法对用户339关于电影的评分167620做出预测，因为训练集中没有该物品数据\n",
      "无法对用户339关于电影的评分88267做出预测，因为训练集中没有该物品数据\n",
      "无法对用户343关于电影的评分6314做出预测，因为训练集中没有该物品数据\n",
      "无法对用户345关于电影的评分438做出预测，因为训练集中没有该物品数据\n",
      "无法对用户345关于电影的评分7026做出预测，因为训练集中没有该物品数据\n",
      "无法对用户345关于电影的评分5694做出预测，因为训练集中没有该物品数据\n",
      "无法对用户357关于电影的评分4353做出预测，因为训练集中没有该物品数据\n",
      "无法对用户357关于电影的评分3442做出预测，因为训练集中没有该物品数据\n",
      "无法对用户357关于电影的评分4099做出预测，因为训练集中没有该物品数据\n",
      "无法对用户357关于电影的评分4654做出预测，因为训练集中没有该物品数据\n",
      "无法对用户357关于电影的评分2756做出预测，因为训练集中没有该物品数据\n",
      "无法对用户357关于电影的评分3768做出预测，因为训练集中没有该物品数据\n",
      "无法对用户363关于电影的评分26680做出预测，因为训练集中没有该物品数据\n",
      "无法对用户375关于电影的评分179135做出预测，因为训练集中没有该物品数据\n",
      "无法对用户377关于电影的评分55116做出预测，因为训练集中没有该物品数据\n",
      "无法对用户377关于电影的评分60293做出预测，因为训练集中没有该物品数据\n",
      "无法对用户378关于电影的评分69458做出预测，因为训练集中没有该物品数据\n",
      "无法对用户382关于电影的评分5646做出预测，因为训练集中没有该物品数据\n",
      "无法对用户387关于电影的评分62265做出预测，因为训练集中没有该物品数据\n",
      "无法对用户392关于电影的评分26269做出预测，因为训练集中没有该物品数据\n",
      "无法对用户396关于电影的评分38994做出预测，因为训练集中没有该物品数据\n",
      "无法对用户396关于电影的评分71619做出预测，因为训练集中没有该物品数据\n",
      "无法对用户396关于电影的评分71184做出预测，因为训练集中没有该物品数据\n",
      "无法对用户396关于电影的评分68963做出预测，因为训练集中没有该物品数据\n",
      "无法对用户402关于电影的评分1133做出预测，因为训练集中没有该物品数据\n",
      "无法对用户403关于电影的评分118814做出预测，因为训练集中没有该物品数据\n",
      "无法对用户403关于电影的评分74154做出预测，因为训练集中没有该物品数据\n",
      "无法对用户403关于电影的评分105855做出预测，因为训练集中没有该物品数据\n",
      "无法对用户403关于电影的评分157274做出预测，因为训练集中没有该物品数据\n",
      "无法对用户403关于电影的评分97328做出预测，因为训练集中没有该物品数据\n",
      "无法对用户408关于电影的评分1733做出预测，因为训练集中没有该物品数据\n",
      "无法对用户408关于电影的评分1571做出预测，因为训练集中没有该物品数据\n",
      "无法对用户423关于电影的评分245做出预测，因为训练集中没有该物品数据\n",
      "无法对用户427关于电影的评分2885做出预测，因为训练集中没有该物品数据\n",
      "无法对用户427关于电影的评分3143做出预测，因为训练集中没有该物品数据\n",
      "无法对用户427关于电影的评分7236做出预测，因为训练集中没有该物品数据\n",
      "无法对用户427关于电影的评分4286做出预测，因为训练集中没有该物品数据\n",
      "无法对用户427关于电影的评分31107做出预测，因为训练集中没有该物品数据\n",
      "无法对用户427关于电影的评分7461做出预测，因为训练集中没有该物品数据\n",
      "无法对用户445关于电影的评分981做出预测，因为训练集中没有该物品数据\n",
      "无法对用户447关于电影的评分6801做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影的评分179863做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影的评分179287做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影的评分179437做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影的评分183815做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影的评分179285做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影的评分184253做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影的评分179491做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影的评分168586做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影的评分126548做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影的评分184937做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影的评分135504做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影的评分114182做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影的评分115828做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影的评分132798做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影的评分186331做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影的评分104947做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影的评分187481做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影的评分79572做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影的评分188449做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影的评分189399做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影的评分189363做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影的评分135230做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影的评分103606做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影的评分123683做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影的评分189333做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影的评分128520做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影的评分148388做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影的评分190085做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影的评分132800做出预测，因为训练集中没有该物品数据\n",
      "无法对用户449关于电影的评分96863做出预测，因为训练集中没有该物品数据\n",
      "无法对用户457关于电影的评分8010做出预测，因为训练集中没有该物品数据\n",
      "无法对用户458关于电影的评分37477做出预测，因为训练集中没有该物品数据\n",
      "无法对用户458关于电影的评分40574做出预测，因为训练集中没有该物品数据\n",
      "无法对用户458关于电影的评分27408做出预测，因为训练集中没有该物品数据\n",
      "无法对用户463关于电影的评分807做出预测，因为训练集中没有该物品数据\n",
      "无法对用户463关于电影的评分872做出预测，因为训练集中没有该物品数据\n",
      "无法对用户465关于电影的评分106491做出预测，因为训练集中没有该物品数据\n",
      "无法对用户471关于电影的评分162322做出预测，因为训练集中没有该物品数据\n",
      "无法对用户473关于电影的评分3187做出预测，因为训练集中没有该物品数据\n",
      "无法对用户473关于电影的评分3402做出预测，因为训练集中没有该物品数据\n",
      "无法对用户473关于电影的评分3637做出预测，因为训练集中没有该物品数据\n",
      "无法对用户491关于电影的评分1063做出预测，因为训练集中没有该物品数据\n",
      "无法对用户496关于电影的评分3124做出预测，因为训练集中没有该物品数据\n",
      "无法对用户514关于电影的评分59392做出预测，因为训练集中没有该物品数据\n",
      "无法对用户521关于电影的评分59440做出预测，因为训练集中没有该物品数据\n",
      "无法对用户526关于电影的评分5588做出预测，因为训练集中没有该物品数据\n",
      "无法对用户526关于电影的评分78319做出预测，因为训练集中没有该物品数据\n",
      "无法对用户526关于电影的评分92206做出预测，因为训练集中没有该物品数据\n",
      "无法对用户526关于电影的评分103547做出预测，因为训练集中没有该物品数据\n",
      "无法对用户526关于电影的评分133295做出预测，因为训练集中没有该物品数据\n",
      "无法对用户526关于电影的评分96214做出预测，因为训练集中没有该物品数据\n",
      "无法对用户526关于电影的评分5891做出预测，因为训练集中没有该物品数据\n",
      "无法对用户526关于电影的评分80185做出预测，因为训练集中没有该物品数据\n",
      "无法对用户526关于电影的评分5734做出预测，因为训练集中没有该物品数据\n",
      "无法对用户526关于电影的评分5786做出预测，因为训练集中没有该物品数据\n",
      "无法对用户540关于电影的评分117887做出预测，因为训练集中没有该物品数据\n",
      "无法对用户540关于电影的评分6921做出预测，因为训练集中没有该物品数据\n",
      "无法对用户540关于电影的评分5725做出预测，因为训练集中没有该物品数据\n",
      "无法对用户540关于电影的评分91488做出预测，因为训练集中没有该物品数据\n",
      "无法对用户540关于电影的评分81665做出预测，因为训练集中没有该物品数据\n",
      "无法对用户540关于电影的评分8933做出预测，因为训练集中没有该物品数据\n",
      "无法对用户540关于电影的评分4998做出预测，因为训练集中没有该物品数据\n",
      "无法对用户540关于电影的评分33480做出预测，因为训练集中没有该物品数据\n",
      "无法对用户540关于电影的评分4405做出预测，因为训练集中没有该物品数据\n",
      "无法对用户540关于电影的评分114394做出预测，因为训练集中没有该物品数据\n",
      "无法对用户540关于电影的评分6412做出预测，因为训练集中没有该物品数据\n",
      "无法对用户540关于电影的评分60189做出预测，因为训练集中没有该物品数据\n",
      "无法对用户540关于电影的评分3588做出预测，因为训练集中没有该物品数据\n",
      "无法对用户540关于电影的评分7617做出预测，因为训练集中没有该物品数据\n",
      "无法对用户540关于电影的评分55926做出预测，因为训练集中没有该物品数据\n",
      "无法对用户540关于电影的评分42548做出预测，因为训练集中没有该物品数据\n",
      "无法对用户540关于电影的评分116056做出预测，因为训练集中没有该物品数据\n",
      "无法对用户540关于电影的评分3311做出预测，因为训练集中没有该物品数据\n",
      "无法对用户540关于电影的评分90413做出预测，因为训练集中没有该物品数据\n",
      "无法对用户540关于电影的评分129490做出预测，因为训练集中没有该物品数据\n",
      "无法对用户540关于电影的评分89305做出预测，因为训练集中没有该物品数据\n",
      "无法对用户540关于电影的评分152091做出预测，因为训练集中没有该物品数据\n",
      "无法对用户540关于电影的评分167036做出预测，因为训练集中没有该物品数据\n",
      "无法对用户540关于电影的评分170645做出预测，因为训练集中没有该物品数据\n",
      "无法对用户540关于电影的评分169758做出预测，因为训练集中没有该物品数据\n",
      "无法对用户540关于电影的评分105608做出预测，因为训练集中没有该物品数据\n",
      "无法对用户548关于电影的评分82744做出预测，因为训练集中没有该物品数据\n",
      "无法对用户556关于电影的评分56060做出预测，因为训练集中没有该物品数据\n",
      "无法对用户556关于电影的评分47491做出预测，因为训练集中没有该物品数据\n",
      "无法对用户574关于电影的评分188309做出预测，因为训练集中没有该物品数据\n",
      "无法对用户574关于电影的评分133832做出预测，因为训练集中没有该物品数据\n",
      "无法对用户574关于电影的评分148172做出预测，因为训练集中没有该物品数据\n",
      "无法对用户574关于电影的评分170813做出预测，因为训练集中没有该物品数据\n",
      "无法对用户574关于电影的评分99721做出预测，因为训练集中没有该物品数据\n",
      "无法对用户581关于电影的评分6054做出预测，因为训练集中没有该物品数据\n",
      "无法对用户581关于电影的评分6445做出预测，因为训练集中没有该物品数据\n",
      "无法对用户581关于电影的评分5392做出预测，因为训练集中没有该物品数据\n",
      "无法对用户581关于电影的评分3144做出预测，因为训练集中没有该物品数据\n",
      "无法对用户581关于电影的评分2201做出预测，因为训练集中没有该物品数据\n",
      "无法对用户581关于电影的评分2209做出预测，因为训练集中没有该物品数据\n",
      "无法对用户590关于电影的评分8770做出预测，因为训练集中没有该物品数据\n",
      "无法对用户590关于电影的评分7437做出预测，因为训练集中没有该物品数据\n",
      "无法对用户590关于电影的评分33681做出预测，因为训练集中没有该物品数据\n",
      "无法对用户590关于电影的评分26386做出预测，因为训练集中没有该物品数据\n",
      "无法对用户590关于电影的评分26285做出预测，因为训练集中没有该物品数据\n",
      "无法对用户590关于电影的评分32383做出预测，因为训练集中没有该物品数据\n",
      "无法对用户590关于电影的评分26488做出预测，因为训练集中没有该物品数据\n",
      "无法对用户590关于电影的评分32116做出预测，因为训练集中没有该物品数据\n",
      "无法对用户590关于电影的评分31251做出预测，因为训练集中没有该物品数据\n",
      "无法对用户590关于电影的评分7122做出预测，因为训练集中没有该物品数据\n",
      "无法对用户590关于电影的评分7815做出预测，因为训练集中没有该物品数据\n",
      "无法对用户590关于电影的评分7478做出预测，因为训练集中没有该物品数据\n",
      "无法对用户590关于电影的评分7353做出预测，因为训练集中没有该物品数据\n",
      "无法对用户593关于电影的评分2264做出预测，因为训练集中没有该物品数据\n",
      "无法对用户593关于电影的评分2477做出预测，因为训练集中没有该物品数据\n",
      "无法对用户593关于电影的评分3042做出预测，因为训练集中没有该物品数据\n",
      "无法对用户597关于电影的评分103233做出预测，因为训练集中没有该物品数据\n",
      "无法对用户599关于电影的评分26903做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影的评分59336做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影的评分56945做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影的评分59418做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影的评分27114做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影的评分60674做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影的评分61697做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影的评分59143做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影的评分61073做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影的评分27450做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影的评分43391做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影的评分31785做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影的评分60405做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影的评分63222做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影的评分62235做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影的评分65939做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影的评分44317做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影的评分65907做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影的评分65552做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影的评分46613做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影的评分27643做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影的评分58287做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影的评分27309做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影的评分27152做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影的评分73511做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影的评分46821做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影的评分26602做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影的评分27602做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影的评分72308做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影的评分71910做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影的评分71810做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影的评分61567做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影的评分70706做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影的评分26560做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影的评分26949做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影的评分48673做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影的评分27705做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影的评分74139做出预测，因为训练集中没有该物品数据\n",
      "无法对用户601关于电影的评分79536做出预测，因为训练集中没有该物品数据\n",
      "无法对用户605关于电影的评分101850做出预测，因为训练集中没有该物品数据\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "无法对用户605关于电影的评分6558做出预测，因为训练集中没有该物品数据\n",
      "无法对用户605关于电影的评分27729做出预测，因为训练集中没有该物品数据\n",
      "无法对用户605关于电影的评分97196做出预测，因为训练集中没有该物品数据\n",
      "无法对用户605关于电影的评分80839做出预测，因为训练集中没有该物品数据\n",
      "无法对用户605关于电影的评分47202做出预测，因为训练集中没有该物品数据\n",
      "无法对用户605关于电影的评分60674做出预测，因为训练集中没有该物品数据\n",
      "无法对用户605关于电影的评分59392做出预测，因为训练集中没有该物品数据\n",
      "无法对用户616关于电影的评分1460做出预测，因为训练集中没有该物品数据\n",
      "无法对用户632关于电影的评分126548做出预测，因为训练集中没有该物品数据\n",
      "无法对用户653关于电影的评分117464做出预测，因为训练集中没有该物品数据\n",
      "无法对用户667关于电影的评分111764做出预测，因为训练集中没有该物品数据\n",
      "无法对用户667关于电影的评分108825做出预测，因为训练集中没有该物品数据\n",
      "无法对用户667关于电影的评分109963做出预测，因为训练集中没有该物品数据\n",
      "无法对用户667关于电影的评分108078做出预测，因为训练集中没有该物品数据\n",
      "无法对用户667关于电影的评分73804做出预测，因为训练集中没有该物品数据\n",
      "无法对用户667关于电影的评分142456做出预测，因为训练集中没有该物品数据\n",
      "无法对用户667关于电影的评分165951做出预测，因为训练集中没有该物品数据\n",
      "无法对用户667关于电影的评分162474做出预测，因为训练集中没有该物品数据\n",
      "无法对用户667关于电影的评分166285做出预测，因为训练集中没有该物品数据\n",
      "无法对用户667关于电影的评分168646做出预测，因为训练集中没有该物品数据\n",
      "无法对用户667关于电影的评分87992做出预测，因为训练集中没有该物品数据\n",
      "无法对用户669关于电影的评分6012做出预测，因为训练集中没有该物品数据\n",
      "无法对用户669关于电影的评分6523做出预测，因为训练集中没有该物品数据\n",
      "无法对用户669关于电影的评分6315做出预测，因为训练集中没有该物品数据\n",
      "无法对用户669关于电影的评分6584做出预测，因为训练集中没有该物品数据\n",
      "无法对用户669关于电影的评分6689做出预测，因为训练集中没有该物品数据\n",
      "无法对用户697关于电影的评分167036做出预测，因为训练集中没有该物品数据\n",
      "无法对用户697关于电影的评分114552做出预测，因为训练集中没有该物品数据\n",
      "无法对用户697关于电影的评分157340做出预测，因为训练集中没有该物品数据\n",
      "无法对用户697关于电影的评分130075做出预测，因为训练集中没有该物品数据\n",
      "无法对用户697关于电影的评分170957做出预测，因为训练集中没有该物品数据\n",
      "无法对用户697关于电影的评分179811做出预测，因为训练集中没有该物品数据\n",
      "无法对用户697关于电影的评分133945做出预测，因为训练集中没有该物品数据\n",
      "无法对用户719关于电影的评分113604做出预测，因为训练集中没有该物品数据\n",
      "无法对用户719关于电影的评分111795做出预测，因为训练集中没有该物品数据\n",
      "无法对用户719关于电影的评分114184做出预测，因为训练集中没有该物品数据\n",
      "无法对用户719关于电影的评分114265做出预测，因为训练集中没有该物品数据\n",
      "无法对用户719关于电影的评分144760做出预测，因为训练集中没有该物品数据\n",
      "无法对用户719关于电影的评分140131做出预测，因为训练集中没有该物品数据\n",
      "无法对用户719关于电影的评分162322做出预测，因为训练集中没有该物品数据\n",
      "无法对用户719关于电影的评分161580做出预测，因为训练集中没有该物品数据\n",
      "无法对用户719关于电影的评分165527做出预测，因为训练集中没有该物品数据\n",
      "无法对用户719关于电影的评分167018做出预测，因为训练集中没有该物品数据\n",
      "无法对用户719关于电影的评分166788做出预测，因为训练集中没有该物品数据\n",
      "无法对用户719关于电影的评分157312做出预测，因为训练集中没有该物品数据\n",
      "无法对用户719关于电影的评分140301做出预测，因为训练集中没有该物品数据\n",
      "无法对用户719关于电影的评分155509做出预测，因为训练集中没有该物品数据\n",
      "无法对用户719关于电影的评分107640做出预测，因为训练集中没有该物品数据\n",
      "无法对用户719关于电影的评分167234做出预测，因为训练集中没有该物品数据\n",
      "无法对用户719关于电影的评分108134做出预测，因为训练集中没有该物品数据\n",
      "无法对用户719关于电影的评分156369做出预测，因为训练集中没有该物品数据\n",
      "无法对用户719关于电影的评分165347做出预测，因为训练集中没有该物品数据\n",
      "无法对用户719关于电影的评分161956做出预测，因为训练集中没有该物品数据\n",
      "无法对用户719关于电影的评分172813做出预测，因为训练集中没有该物品数据\n",
      "无法对用户719关于电影的评分169028做出预测，因为训练集中没有该物品数据\n",
      "无法对用户719关于电影的评分173835做出预测，因为训练集中没有该物品数据\n",
      "无法对用户722关于电影的评分68288做出预测，因为训练集中没有该物品数据\n",
      "无法对用户728关于电影的评分179135做出预测，因为训练集中没有该物品数据\n",
      "无法对用户755关于电影的评分2675做出预测，因为训练集中没有该物品数据\n",
      "无法对用户757关于电影的评分100611做出预测，因为训练集中没有该物品数据\n",
      "无法对用户757关于电影的评分90738做出预测，因为训练集中没有该物品数据\n",
      "无法对用户760关于电影的评分179做出预测，因为训练集中没有该物品数据\n",
      "无法对用户769关于电影的评分108做出预测，因为训练集中没有该物品数据\n",
      "无法对用户772关于电影的评分59143做出预测，因为训练集中没有该物品数据\n",
      "无法对用户778关于电影的评分25801做出预测，因为训练集中没有该物品数据\n",
      "无法对用户790关于电影的评分797做出预测，因为训练集中没有该物品数据\n",
      "无法对用户795关于电影的评分6625做出预测，因为训练集中没有该物品数据\n",
      "无法对用户795关于电影的评分26849做出预测，因为训练集中没有该物品数据\n",
      "无法对用户795关于电影的评分6788做出预测，因为训练集中没有该物品数据\n",
      "无法对用户795关于电影的评分32442做出预测，因为训练集中没有该物品数据\n",
      "无法对用户795关于电影的评分44241做出预测，因为训练集中没有该物品数据\n",
      "无法对用户795关于电影的评分70990做出预测，因为训练集中没有该物品数据\n",
      "无法对用户795关于电影的评分26856做出预测，因为训练集中没有该物品数据\n",
      "无法对用户795关于电影的评分78539做出预测，因为训练集中没有该物品数据\n",
      "无法对用户804关于电影的评分120478做出预测，因为训练集中没有该物品数据\n",
      "无法对用户804关于电影的评分103659做出预测，因为训练集中没有该物品数据\n",
      "无法对用户804关于电影的评分183897做出预测，因为训练集中没有该物品数据\n",
      "无法对用户807关于电影的评分86290做出预测，因为训练集中没有该物品数据\n",
      "无法对用户808关于电影的评分27251做出预测，因为训练集中没有该物品数据\n",
      "无法对用户813关于电影的评分8582做出预测，因为训练集中没有该物品数据\n",
      "无法对用户814关于电影的评分2293做出预测，因为训练集中没有该物品数据\n",
      "无法对用户814关于电影的评分3158做出预测，因为训练集中没有该物品数据\n",
      "无法对用户815关于电影的评分85261做出预测，因为训练集中没有该物品数据\n",
      "无法对用户815关于电影的评分35015做出预测，因为训练集中没有该物品数据\n",
      "无法对用户815关于电影的评分114552做出预测，因为训练集中没有该物品数据\n",
      "无法对用户815关于电影的评分104303做出预测，因为训练集中没有该物品数据\n",
      "无法对用户815关于电影的评分117887做出预测，因为训练集中没有该物品数据\n",
      "无法对用户815关于电影的评分155894做出预测，因为训练集中没有该物品数据\n",
      "无法对用户815关于电影的评分127114做出预测，因为训练集中没有该物品数据\n",
      "无法对用户815关于电影的评分157961做出预测，因为训练集中没有该物品数据\n",
      "无法对用户815关于电影的评分141397做出预测，因为训练集中没有该物品数据\n",
      "无法对用户815关于电影的评分167732做出预测，因为训练集中没有该物品数据\n",
      "无法对用户815关于电影的评分169028做出预测，因为训练集中没有该物品数据\n",
      "无法对用户815关于电影的评分140301做出预测，因为训练集中没有该物品数据\n",
      "无法对用户815关于电影的评分167018做出预测，因为训练集中没有该物品数据\n",
      "无法对用户815关于电影的评分155062做出预测，因为训练集中没有该物品数据\n",
      "无法对用户815关于电影的评分166024做出预测，因为训练集中没有该物品数据\n",
      "无法对用户815关于电影的评分175333做出预测，因为训练集中没有该物品数据\n",
      "无法对用户815关于电影的评分180095做出预测，因为训练集中没有该物品数据\n",
      "无法对用户818关于电影的评分151759做出预测，因为训练集中没有该物品数据\n",
      "无法对用户818关于电影的评分108709做出预测，因为训练集中没有该物品数据\n",
      "无法对用户818关于电影的评分164917做出预测，因为训练集中没有该物品数据\n",
      "无法对用户818关于电影的评分158858做出预测，因为训练集中没有该物品数据\n",
      "无法对用户818关于电影的评分110669做出预测，因为训练集中没有该物品数据\n",
      "无法对用户818关于电影的评分184257做出预测，因为训练集中没有该物品数据\n",
      "无法对用户818关于电影的评分167392做出预测，因为训练集中没有该物品数据\n",
      "无法对用户818关于电影的评分178061做出预测，因为训练集中没有该物品数据\n",
      "无法对用户818关于电影的评分148036做出预测，因为训练集中没有该物品数据\n",
      "无法对用户818关于电影的评分168608做出预测，因为训练集中没有该物品数据\n",
      "无法对用户818关于电影的评分159195做出预测，因为训练集中没有该物品数据\n",
      "无法对用户818关于电影的评分180095做出预测，因为训练集中没有该物品数据\n",
      "无法对用户818关于电影的评分180297做出预测，因为训练集中没有该物品数据\n",
      "无法对用户818关于电影的评分161127做出预测，因为训练集中没有该物品数据\n",
      "无法对用户818关于电影的评分141946做出预测，因为训练集中没有该物品数据\n",
      "无法对用户818关于电影的评分157318做出预测，因为训练集中没有该物品数据\n",
      "无法对用户818关于电影的评分180045做出预测，因为训练集中没有该物品数据\n",
      "无法对用户818关于电影的评分181315做出预测，因为训练集中没有该物品数据\n",
      "无法对用户830关于电影的评分4404做出预测，因为训练集中没有该物品数据\n",
      "无法对用户830关于电影的评分7786做出预测，因为训练集中没有该物品数据\n",
      "无法对用户830关于电影的评分43177做出预测，因为训练集中没有该物品数据\n",
      "无法对用户830关于电影的评分60816做出预测，因为训练集中没有该物品数据\n",
      "无法对用户842关于电影的评分476做出预测，因为训练集中没有该物品数据\n",
      "无法对用户842关于电影的评分1798做出预测，因为训练集中没有该物品数据\n",
      "无法对用户854关于电影的评分4241做出预测，因为训练集中没有该物品数据\n",
      "无法对用户861关于电影的评分2047做出预测，因为训练集中没有该物品数据\n",
      "无法对用户861关于电影的评分6232做出预测，因为训练集中没有该物品数据\n",
      "无法对用户864关于电影的评分60674做出预测，因为训练集中没有该物品数据\n",
      "无法对用户864关于电影的评分117496做出预测，因为训练集中没有该物品数据\n",
      "无法对用户864关于电影的评分123288做出预测，因为训练集中没有该物品数据\n",
      "无法对用户864关于电影的评分71201做出预测，因为训练集中没有该物品数据\n",
      "无法对用户867关于电影的评分33072做出预测，因为训练集中没有该物品数据\n",
      "无法对用户867关于电影的评分33245做出预测，因为训练集中没有该物品数据\n",
      "无法对用户867关于电影的评分42783做出预测，因为训练集中没有该物品数据\n",
      "无法对用户867关于电影的评分56631做出预测，因为训练集中没有该物品数据\n",
      "无法对用户869关于电影的评分59143做出预测，因为训练集中没有该物品数据\n",
      "无法对用户869关于电影的评分6784做出预测，因为训练集中没有该物品数据\n",
      "无法对用户869关于电影的评分54934做出预测，因为训练集中没有该物品数据\n",
      "无法对用户869关于电影的评分60141做出预测，因为训练集中没有该物品数据\n",
      "无法对用户869关于电影的评分61255做出预测，因为训练集中没有该物品数据\n",
      "无法对用户883关于电影的评分706做出预测，因为训练集中没有该物品数据\n",
      "无法对用户883关于电影的评分834做出预测，因为训练集中没有该物品数据\n",
      "无法对用户890关于电影的评分7059做出预测，因为训练集中没有该物品数据\n",
      "无法对用户890关于电影的评分4263做出预测，因为训练集中没有该物品数据\n",
      "无法对用户896关于电影的评分2938做出预测，因为训练集中没有该物品数据\n",
      "无法对用户907关于电影的评分751做出预测，因为训练集中没有该物品数据\n",
      "无法对用户917关于电影的评分33675做出预测，因为训练集中没有该物品数据\n",
      "无法对用户926关于电影的评分5311做出预测，因为训练集中没有该物品数据\n",
      "无法对用户930关于电影的评分48883做出预测，因为训练集中没有该物品数据\n",
      "无法对用户930关于电影的评分62049做出预测，因为训练集中没有该物品数据\n",
      "无法对用户930关于电影的评分26989做出预测，因为训练集中没有该物品数据\n",
      "无法对用户930关于电影的评分63237做出预测，因为训练集中没有该物品数据\n",
      "无法对用户930关于电影的评分33410做出预测，因为训练集中没有该物品数据\n",
      "无法对用户930关于电影的评分61961做出预测，因为训练集中没有该物品数据\n",
      "无法对用户930关于电影的评分58367做出预测，因为训练集中没有该物品数据\n",
      "无法对用户930关于电影的评分52227做出预测，因为训练集中没有该物品数据\n",
      "无法对用户930关于电影的评分54278做出预测，因为训练集中没有该物品数据\n",
      "无法对用户930关于电影的评分26700做出预测，因为训练集中没有该物品数据\n",
      "无法对用户930关于电影的评分50005做出预测，因为训练集中没有该物品数据\n",
      "无法对用户930关于电影的评分7124做出预测，因为训练集中没有该物品数据\n",
      "无法对用户930关于电影的评分8809做出预测，因为训练集中没有该物品数据\n",
      "无法对用户930关于电影的评分55288做出预测，因为训练集中没有该物品数据\n",
      "无法对用户930关于电影的评分60816做出预测，因为训练集中没有该物品数据\n",
      "无法对用户932关于电影的评分268做出预测，因为训练集中没有该物品数据\n",
      "无法对用户939关于电影的评分34450做出预测，因为训练集中没有该物品数据\n",
      "无法对用户939关于电影的评分7041做出预测，因为训练集中没有该物品数据\n",
      "无法对用户939关于电影的评分93240做出预测，因为训练集中没有该物品数据\n",
      "无法对用户939关于电影的评分133782做出预测，因为训练集中没有该物品数据\n",
      "无法对用户953关于电影的评分2342做出预测，因为训练集中没有该物品数据\n",
      "无法对用户953关于电影的评分115做出预测，因为训练集中没有该物品数据\n",
      "无法对用户953关于电影的评分1571做出预测，因为训练集中没有该物品数据\n",
      "无法对用户954关于电影的评分89480做出预测，因为训练集中没有该物品数据\n",
      "无法对用户957关于电影的评分92643做出预测，因为训练集中没有该物品数据\n",
      "无法对用户957关于电影的评分106983做出预测，因为训练集中没有该物品数据\n",
      "无法对用户957关于电影的评分136926做出预测，因为训练集中没有该物品数据\n",
      "无法对用户957关于电影的评分111387做出预测，因为训练集中没有该物品数据\n",
      "无法对用户957关于电影的评分104339做出预测，因为训练集中没有该物品数据\n",
      "无法对用户957关于电影的评分143271做出预测，因为训练集中没有该物品数据\n",
      "无法对用户957关于电影的评分141674做出预测，因为训练集中没有该物品数据\n",
      "无法对用户957关于电影的评分148956做出预测，因为训练集中没有该物品数据\n",
      "无法对用户957关于电影的评分140289做出预测，因为训练集中没有该物品数据\n",
      "无法对用户957关于电影的评分159191做出预测，因为训练集中没有该物品数据\n",
      "无法对用户957关于电影的评分147607做出预测，因为训练集中没有该物品数据\n",
      "无法对用户957关于电影的评分117877做出预测，因为训练集中没有该物品数据\n",
      "无法对用户970关于电影的评分130970做出预测，因为训练集中没有该物品数据\n",
      "无法对用户970关于电影的评分100106做出预测，因为训练集中没有该物品数据\n",
      "无法对用户970关于电影的评分44633做出预测，因为训练集中没有该物品数据\n",
      "无法对用户970关于电影的评分26164做出预测，因为训练集中没有该物品数据\n",
      "无法对用户970关于电影的评分6395做出预测，因为训练集中没有该物品数据\n",
      "无法对用户970关于电影的评分103444做出预测，因为训练集中没有该物品数据\n",
      "无法对用户970关于电影的评分56490做出预测，因为训练集中没有该物品数据\n",
      "无法对用户970关于电影的评分148238做出预测，因为训练集中没有该物品数据\n",
      "无法对用户972关于电影的评分3103做出预测，因为训练集中没有该物品数据\n",
      "无法对用户972关于电影的评分8899做出预测，因为训练集中没有该物品数据\n",
      "无法对用户982关于电影的评分5192做出预测，因为训练集中没有该物品数据\n",
      "无法对用户982关于电影的评分8952做出预测，因为训练集中没有该物品数据\n",
      "无法对用户984关于电影的评分170403做出预测，因为训练集中没有该物品数据\n",
      "无法对用户1000关于电影的评分73860做出预测，因为训练集中没有该物品数据\n",
      "用时4145.046018秒\n",
      "RMSE为：1.58777\n",
      "MAE为：0.23901\n"
     ]
    }
   ],
   "source": [
    "record_test = test_predict(record,P,Q,B_user,B_item,u)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "2b8e83bd",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.rcParams['font.sans-serif']=['SimHei']\n",
    "plt.rcParams['axes.unicode_minus'] = False\n",
    "\n",
    "plt.figure(figsize=(10,5))\n",
    "x=np.arange(1,len(train_rmse_lst)+1)\n",
    "y_train_rmse_lst=train_rmse_lst\n",
    "y_validation_rmse_lst=validation_rmse_lst\n",
    "plt.plot(x,y_train_rmse_lst,label=\"train\")\n",
    "plt.plot(x,y_validation_rmse_lst,label=\"validation\")\n",
    "plt.xlabel(\"training steps\",fontsize=15)\n",
    "plt.ylabel(\"RMSE\",fontsize=15)\n",
    "plt.legend(fontsize=15)\n",
    "\n",
    "plt.savefig(\"E:/推荐系统/图片/BiasLFM_RMSE.png\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "2d27527f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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iMgIMuSFz621jcaYxcB5wE+ttTXA2hPc0wC8D4y4CrFREWH87MoSClLjuPOlLby7fR+3X1LEBUVZgW6aiIiIjADDss+ZtfaAtfYxL5id9D0jhTGGfz53En/56mn4YiO56aGV3PDgCioPHA5000RERIZVYWEhr732Wq/Xbr/9dq6//voBvcZgtykYqELAEJo7NoWnblnE/7loKm9v28t5d7zB0je209bRGeimiYiIBNxtt93GPffcM+ive6LwVVpayqJFve3sFRwUzoZYZHgYN545gZe+dRanT0zjP5/dxMW/eosXN9RqwYCIiIxqMTExxMXFDfv7JiUlEREx5DO7TprC2TDJTY7l90vmsfS6ubR2dPLlP6zgM/e8w5tb9yikiYhIUHr66afJysqis9M/4nPttddy6623Yq3lu9/9LllZWSQmJnLhhRdSU9O/mUkfN6z55JNPMnnyZBITE/nWt7511LV9+/ZxxRVX4PP5SE9P5+abb+5u38SJEzHGsGvXLs4++2yMMVx99dUfef3eetastfziF79g/PjxpKWlccMNN9DY2AjAa6+9RmFhIS+99BLTpk0jPj6ez372szQ3D011oOCNjSHq/KIszpmawZOrqvjly1u57r73OWVcKt8+fwqnjEsNdPNERGQoPXcb1JQF5r2ziuHC/+7XUy644ALa29tZvnw5CxcupL29nWeffZZ//OMfPPDAA9x99928+uqrZGdnc9NNN/HDH/6QX//61wNq5qZNm7jqqqu48847ufjii/n+97/Prl27uq/feuut7Ny5k7Vr13L48GEuvPBCFi9ezJVXXsnq1avp6OigpKSEe+65h0WLFhEVFdWn9/3Nb37Dj3/8Yx5++GHy8/P58pe/zLXXXsuyZcsAFwq/+c1vcu+99xIbG8sFF1zAI4880qc5c/2lcBYAEeFhfG5+PpfOzuHRDyq465VtfO5377JoYhpfOWsCp08cgzEm0M0UEZFRLjIykiuuuIJly5axcOFC3nzzTcaMGcP8+fOZOnUqn/nMZwBYuXIlzc3NbNq0acDv+cQTTzBt2jS+/vWvA3D33XfzyCOPdF+/4447iImJYf/+/WzcuBFjTPf7JiYmAhAWFkZCQgLJycl9ft+7776bb33rW5x33nmAC2vFxcXs2LEDgKamJpYuXcrChQsBOO+8844KjYNJ4SyAoiPC+eLCQq6cm89D7+3k3jd3cO19y5mWncSNZ47j4pIcIsM18iwiEjL62XMVDK655hq++tWv8l//9V/8/e9/55prrgGgsrKSG2+8kXXr1jFz5kzi4+M5dOjQgN+vqqqKwsLC7t+Tk5NJS0vr/v3tt9/m1ltv5fDhw8yfP5+UlBQ6OjoG/L67du1i4sSJ3b93Pd65cyfGGHw+X3cwA4iOjh6yaUn6L38QiI0K58YzJ/DWd87mp5eX0NbRyTcfXcuZP32Ve9/4kIPNbYFuooiIjFJnnHEGBw8eZPv27SxbtozPf/7zANx8882MHz+effv28dprr3HRRRcNyvtlZWVRWekvg9jU1MS+ffsAaGlp4eqrr+a2226jurqav//970cFqi5hYWH9Dk6FhYVs3bq1+/eux+PGjQPoVy/cQCmcBZHoiHA+Nz+fF/73mdx//TwKUuP48bMbWfCfL/N//lrGhurGQDdRRERGGWMMV111FT/84Q9JTk5m6tSpABw8eJCOjg7q6up44okn+MEPfjAoPUmXX345paWlLF26lPLycv75n/+Z9nZXbae1tZWWlhaam5uprKzkJz/5CU8++eRH3nfKlCk888wz1NTU8Prrr3dP7D+eW265hZ///Oe8+OKLbNq0ia997WtccsklR/XiDReFsyAUFmY4Z2omj960kGVfP51PzsjmLysruehXb3LZPW/z5KpKmtsG3oUrIiLSF9dccw0PPvhg95AmwM9//nNWr17NxIkTueuuu7jlllvYuHEjhw8PbMP1GTNm8Mc//pGf/vSnzJ49m+joaPLz8wE3p+yuu+7ixz/+MTNnzqSsrIxrrrmGlStXHvUad955J2+88QYFBQUsWbKEI0eOnPB9b7rpJr73ve9x4403smjRIiZPnsxDDz00oM9yskyobOMwb948u2LFikA3Y8jUH27liZWVPLy8nA/3HiIlLpLL5uRxxdw8pmUnBbp5IiJyjI0bNzJt2rRAN0MC6Hj/GzDGrLTWzuvtmhYEjBDJcVHccMZ4/teicby7fR9/XL6LP7y7k/ve2kFRThJXzM3j0lm5pMb3bcmwiIiIBCeFsxHGGMNpE9M4bWIaBw61smxtNU+srOQHT23gx89s5JypGVw2J5fFUzKIiQwPdHNFRESknxTORrCU+CiWnFbIktMK2VTTyF9WVvLX1VW8sKGWxOgIzi/K4tMzszl9Ypq25BARERkhFM5CxNSsJL73qel855NTeWf7Pp5aW83z62v4y6pKUuOjuKg4i4uKszmlMJUIBTUREZGgpXAWYiLCwzhzcjpnTk7nR5+dweub93QPff7xvXJS46M4f3omn5yRxWkT0oiKUFATERkq1lpVfBmlBrLgUuEshEVHhHN+URbnF2VxuLWd1zfv4bl1NTxduptHPqggMSaCc6dlcv70TM6YnE5CtP7nICIyWCIjIzly5AhxcXGBbooEwJEjR4iMjDyp52orjVGoua2Dt7ft5fl1Nby4sZb6w21EhYexcMIYzp2eybnTMsj2xQa6mSIiI1pjYyO1tbXk5uYSGxurHrRRwlrLkSNHqKqqIjMzk6Sk3re7Ot5WGgpno1x7Rycrdh3g5Y21vLihlp373OaBRTlJnDM1g8VTMpiVn0x4mP5RERHpr8bGRurq6mhrUxm+0SQyMpKMjIyPDWagcCZ9ZK1l+55DvLSxlpc21LKq/ACdFlLiIjlzcjpnT8ngzMnp2ktNRERkgBTO5KTUH27lja17eW1zHa9v3sO+Q60YAyW5Ps6cnM4Zk9KZXZCsbTpERET6SeFMBqyz01JW1cBrm/fwxtY9rKmop6PTkhgdwcIJYzhjcjqLJqZROCZO8ypEREROQOFMBl3DkTbe3b6X17fs5Y0te6iqd0Vlc5NjOX3iGE6fmMZpE9JIT4wOcEtFRESCj8KZDClrLTv3HebtbXt5e9te3tm+j4YjbvLrlMxEFk4Yw2kTxnDquDH44k5uWbGIiEgoUTiTYdXRaVlf3cBb2/byzrZ9rNi1n+a2ToyBGTk+Fk4Yw8LxY5hXmEJijMKaiIiMPgpnElAt7R2sKa/n3Q/38c72fawpr6e1o5MwAzNyfSwYP4ZTx6Uyf1wqSQprIiIyCiicSVA50trB6vIDvPfhPt7bsf+osDY9J4n5hakurBWmMiZBc9ZERCT0KJxJUGtu62B1eT3vfbiP93fsZ1X5AVraOwGYkB7PKePGcMq4FOaNTSUvRbtsi4jIyKdwJiNKa3snZVUNvL9jP+/v2MeKXQc42NwOQLYvhnmFqcwvTGF+YSqTMxNVvUBEREYchTMZ0To6LZtrDrJi137e37GfD3bup7axBYDE6Ahmj01hnnfMKkgmLkoF3EVEJLgpnElIsdZSeeAIH+zcz4pdB1i58wBb6g5iLYSHGaZnJzF3bEr3kZOsIu4iIhJcFM4k5DUcaWNVuQtqK3btZ21FA0faOgDISoph7tgU5oxNYU5BMkU5PqIiVHJKREQC53jhTOM/EhJ8sZGcPSWDs6dkANDe0cmmmoOs3HWg+3imbDcAURFhFOf6mFOQzJwCF9oyk2IC2XwREZFu6jmTUaOmoZlV5QdYXX6AVeX1lFU10OqtCs1NjmVWQTKz85OZXZBCUU4SMZHhAW6xiIiEKg1rivSipb2DDdWNrCqvZ3X5AVaX13fXCI0MN0zP8XlhLZnZ+Snkp2obDxERGRwKZyJ9VNfYzOqKelaX17Oq/ABllf65a6nxUczKd71rswqSKclLxherigYiItJ/mnMm0kcZSTFcUJTFBUVZgJu7tqW2idUVB1hTXs/qinpe2VTXff+E9Hhm5acwK9/HrPwUpmYnEhmuxQYiInLy1HMm0k+NzW2UVjSwpuIAayrqWVNRz96mVgCiI8IoykliZn4ys7yjIDVOw6EiInIUDWuKDCFrLVX1R1hTUc9aL6yVVTXQ3OYWG6TERVKSl8zM/GRm5vmYmZ9MmmqGioiMahrWFBlCxhjyUuLIS4nj4pIcwA2Hbq49yJqKekorGlhbWc/dr2yl0/v/QrnJsczM9zHTC20zcn0kROuvo4iIKJyJDImI8DCKcnwU5fj4wqnu3KGWdtZXN7retcp6SivrebasBgBjYFJGguth83rXpmYlabNcEZFRSOFMZJjER0dwyrhUThmX2n1uX1MLpZWuZ21tRT2vbqrjiZWVAESFhzEtO5GSvGRKvMA2IT1Bhd5FREKc5pyJBJGuuqGllQ2UVtaztrKedVWNNLW0AxAXFc6MHB8leT5K8pMpyfUxdowWHIiIjDRaECAygnV2Wj7c28Taiq7A1sCG3Y3d1Q18sZGU5PkozvV197Jl+2IU2EREgpjCmUiIaW3vZEvtwe4ettLKBjbXHqTDW3GQlhDNzDwfxXleL1ueVoiKiAQTrdYUCTFREWHMyPUxI9fHNacWANDc1sGG3Y2UVriwVlrVwCub6+j6/185vhhK8pK7A1txro/kuKgAfgoREemNwplIiIiJDGdOQQpzClK6zzW1tLO+qoGyqobuXrbn19d0Xy9IjfN61nwU5yYzIzeJxBiVpBIRCSSFM5EQlhAdwanjx3Dq+DHd5xoOt7Gu2oW1sipXR/Tp0t3d18enx1Pi9cqV5CVTlJNEvPZgExEZNvoXV2SU8cVFcvrENE6fmNZ9bl9TC2VVDZR5w6Hvfbifv62pBtwebBPTE9xwaK6P4rxkpmcnERsVHqiPICIS0oZlQYAx5j5gOvCMtfZH/bnHGHMP8Jy19qnjvceQLwioWQd/vQk+dQcUnDp07yMSJOoam73eNf+w6N6mFgDCwwyTMhK8FaIusE3NSiQmUoFNRKQvArogwBhzGRBurV1ojLnfGDPJWru1L/cYY84Ask4UzIZFYhbUroPydxTOZFTISIrh3OkxnDs9E3B7sNU2tnSvDi2rauDlTXU87m2aGxFmmJKVSHGut0o0N5kpWYmqciAi0k/DMay5GHjMe/wCsAjYeqJ7jDE7gXuBZ40xl1pr/z7kLT2e+DQYMwnKlwe0GSKBYowhyxdDli+L84uyABfYqhuaKesR2J5fX8MjH1QArsrBlKxEir3VocW5PiZnKrCJiBzPcISzeKDKe7wfmNPHe74IbAB+CtxijCmw1t7V80nGmBuBGwEKCgoGv+XHKlgAm56Gzk4I039cRIwx5CbHkpscyydnZAP+Kgc9V4g+vbaah5eXA/6yVDNy/atEJ2UmEBmuv1MiIjA84awJiPUeJwC9/Qvc2z2zgaXW2hpjzB+BHwNHhTNr7VJgKbg5Z4Pf9GMULIDVD8HeLZAxdcjfTmQkMsaQnxpHfmocFxX7A1v5/sOUVjawzgtty9ZW86euwBYRxvTspO4h0eJcH5MyEohQYBORUWg4wtlK3FDme8BMYHMf7zkMjPeuzwN2DXlLT6RgoftZ/q7CmUg/GGMYOyaesWPi+fTMHMCVpdq1/zCllfXdge3JVZU89J77qx4TGca07KSjtvWYkB6vwCYiIW/IV2saY5KAN4GXgQuBq4ErrbXfP849C4BO4H4gE4gErrDWVvExhqV8k7Xws0kw8Vz47G+H9r1ERiFXR/RQd1hbV9XAuuoGDrd2ABAbGc70nKTu+WsleT7GpycQHqY6oiIysgS8tqYxJgU4D3jDWltzsvccz7DV1nz0Wqgpg39eO/TvJSJ0dFp27G3yb+tR2cD66kaOtLnAFhcVTlFOUo85bD7GpSmwiUhwC3g4Gw7DFs7euRte+B7cugmSsof+/UTkIzo6LR/u8Qe2dVVHB7b4qHCKcvzz14rzfIwbE0+YApuIBAkVPh9MXfPOKt6Dos8Gti0io1R4mGFSZiKTMhO5fG4eAO0dnWzfc8jrXauntKqBP763i5b2TsCVspqek+RVOXChrVCBTUSCkMJZf2WXQESs2+9M4UwkaER4e6pNyUrkih6BbZvXw9Y1j+0P7+2i1QtsidERFOV2rRJNpjjXx9jUOAU2EQkohbP+Co+EvHluxaaIBLWI8DCmZiUxNSuJz83LB6Cto5OttU2UVdV3z2F78J1dtHbsACAxJqJ7wUFXD1tBahzGKLCJyPBQODsZBQvgzZ9Dy0GITgx0a0SkHyLDw5iek8T0nCSumu/OtbZ3sqX2IOuq/LVE/+ftnbR2uB42X2wkM3KTKM5N7l4lmpcSq8AmIkNC4exkFCwA2wmVK2DC2YFujYgMUFREGDO8/dSu9s51Bbaeiw7ue+tD2jrcIqrkuEh/D5vXy5abrMAmIgOncHYy8k4BEwYVyxXOREJUz8DWpaW9g801B4+aw7b0jQ9p73SBLSUu0pu75nrZSvJ8ZPtiFNhEpF8Uzk5GTBJkFGnemcgoEx0RTkleMiV5yd3nmts62FRzsHuVaFlVI799/UM6vMCWlhDl9mDrUekgMylagU1EPpbC2ckqWABrHoaOdgjXH6PIaBUTGc6s/GRm5ScDYwEX2Dbubuwu/l5W2cAbW/bg5TXSE6OPGhItyfORkRQTsM8gIsFFqeJkFSyAD+6F2jLImR3o1ohIEImJDGd2QQqzC1K6zx1p7WDD7sbuPdjKKht4dXMdXfuAZyZ1BTY3HDoj10d6YnSAPoGIBJLC2cnqLoK+XOFMRE4oNiqcuWNTmDvWH9gOtbSzYXdjjzls9by8yR/Ycnwx/rJU3j5sqfFRAfoEIjJcFM5Oli8XfPlu3tmCrwS6NSIyAsVHRzC/MJX5hand55pa2l3B964h0aoGXthQ2309LyW2u2etxNvawxcXGYjmi8gQUTgbiIIFsONNsBY0uVdEBkFCdAQLxo9hwfgx3ecam9uOCmvrqhp4tqym+3pBahzFeb7u0lQzcn0kxSiwiYxUCmcDUbAAyh6HAzshdVygWyMiISopJpLTJqRx2oS07nP1h1tZV9VIaVU9pRUNrCmv55nS3d3Xx6fF+4dEc30U5fpIiNY/+SIjgf6mDkR3EfTlCmciMqyS46JYNCmNRZP8gW3/odYeW3o08MHO/SxbWw24zv0J6QndvWsleT6mZ/uIjQoP1EcQkY+hcDYQ6dMg2ufmnc28+sT3i4gModT4KM6anM5Zk9O7z+052NJjSLSeN7ft5cnVVQCEGZicmdi9nUdxXjJTsxKJiVRgEwkkhbOBCAuD/FOg/L1At0REpFfpidGcPTWDs6dmAGCtpbaxpbuHrbSqgZc31fH4ykoAIsIMU7ISveFQt63H5MxEoiLCAvkxREYVhbOBKlgAr7wIh/dDXOqJ7xcRCSBjDFm+GLJ8MZw3PRNwga26oZnSivruwu/PltXw5/crAIgKD2NadqK36CCZknwfE9MTiAhXYBMZCsZ2bagzws2bN8+uWLFi+N+4ejUsXQyf+Hc441vD//4iIkPAWkvF/iOsrazvHhZdV9XAwZZ2AGIiwyjK8Vc4KMnzMS4tgfAwrVwX6QtjzEpr7bxerymcDYI/fx52vgXfWAPxY054u4jISNTZadm57xBlVQ2srXBhbV11A4dbOwCIjwqnKNfXY9FBMoVj4lRHVKQXCmdDbc9muGcBnHITXPjfgWmDiEgAdHRaPtzT1L0H29rKejZUN9LS3glAUkwExT3mrxXn+shLiVVgk1FP4Ww4LPuGK4T+9Q+0rYaIjGptHZ1srW2irKqetV7h9001jbR1uP/epMZH+VeI5roetiyfCr/L6KJwNhwad8Ndc2DKhXDF/YFrh4hIEGpp72BzzUFKK10N0dLKBrbWNdHR6f4blJEYfdQK0eI8H2kJKvwuoet44UyrNQdLUjYsvBne+H/uZ+7cQLdIRCRoREeEU5KXTEleMjAWgCOtHWzY7XrWSisburf16OozyE2OdT1r+aojKqOLes4GU3Mj/Go2ZEyDJU+p3qaISD81tbSzvsof1soq69m573D39cIxcRTnJVPiDYuqLJWMVOo5Gy4xSbD4Nnj227DtJZh0XqBbJCIyoiRER3Dq+DGc2qPwe8Phtu7FBqWV9azadYCnPrYsVTJFOUmqciAjmnrOBltHG/z6FIiIga+8BWH6B0JEZLD1LEtVWukWHuxtagEgPMwwOTOxO7DNzEtmSpaqHEhw0YKA4bb+b/D4Erj0Hpj9hUC3RkQk5FlrqWlsPmrBQVlVA/WH2wBVOZDgo3A23KyF358LjdVw83I33CkiIsOqq8pBaVU9ZZUNXrWDRpq8KgexkeEU5SR1964V5/kYNyaeMFU5kGGgcBYIFR/A/RfA1E/B5/6gxQEiIkGgs9OyY9+h7t610soG1lc30NzmNs1NjI5gRo8VoiV52jRXhobCWaC8cxe88H04/0dw2i2Bbo2IiPSivaOTbXuaKK1ooLTKhbaNu/2b5qbERVKcl8xMb8FBSZ6PzCRtmisDo3AWKNa6uWcbn4Yly6BwUaBbJCIifdDS3sGWmqbuFaLHbpqbmRRNca4LbF2rRFPjowLcahlJFM4CqeUg3HsOHDkAN70BSTmBbpGIiJyErk1zu4ZD11bW8+GeQ93X81JiKenqXcv1MSPPR1KMNs2V3imcBdqezbD0bMiaAUuehgj9vysRkVBwsLmNdVWNrnetyq0Urdh/pPv6+LR4rxyV62WbnpNEXJS2GBWFs+Cw7kl44ktw6lfgwp8EujUiIjJEDhxqpazKv/9aWWUDNY3NAIQZmJyZ6JWlcj1sU7MTiY7QnpijjSoEBIMZl0HlCnjv15A3H4qvCHSLRERkCKTER3Hm5HTOnJzefa6usdkLavXdNUQfX1kJQGS4YWpW15Yervj75EztwTaaHbfnzBjzReBha22793uktbatx/VY4EFr7eeGvKUnEPQ9Z+CqBzz4aaheA194DMadGegWiYhIAFhrqao/4u2/1kCZt0r0YLPbgy0mMoyiHJ/rYfPmsY1P0x5soeSkhzWNMR1AirW20ft9PzDLWlvu/e4D9ltrA94fOyLCGcChvS6g7d+hgCYiIt06Oy279h/usQeb2zT3SFsH4OqOzshNoiQvmeJct3Fufqr2YBupBhLOOoHkHuHsADBT4WyAmvbAHy5RQBMRkePq6LRsq2uitLLeK/7ewMbqRlo73Ka5yXGR3b1rxbnJzMz3kZUUo8A2AiicBaOeAe2aR2H8WYFukYiIjACt7Z1sqT3o1Q+tZ21FA5trD3bvwZaWEO0NhfqHRNMSogPcajnWQBYEWCDOGNMOGO/3WGNMnHc9fvCaOcokpMOSp9wQ58NXKaCJiEifREWEMSPXx4xcH1AAQHNbBxt2N1JW2dA9JPrq5jq6+l9yfDHdm+WWeMXffXHagy1Y9aXnrOcNprff1XM2AD3noF3zCIxfHOgWiYhICDjU0s766saj5rDt3He4+/rYMXFHLTgoykkiUZvmDpuBDGv2qSvHWvv6SbZt0IzYcAb+gLZvG1z8C5j9hUC3SEREQlDD4TbWVbvqBl29bFX1btNcY7o2zfUWHOT7mJ7tIzYq4P0vIWnINqE1xowDPmWtvfukX2SQjOhwBnB4Pzx+Pex4HRZ8Dc77IYRrGzoRERla+5paKK1q8MKaW3hQ29gCaNPcoTRo4cwYEw6cAXzKO6YCjdba5EFo54CM+HAG0NEOL3wPlv8Wxp8NV9wPcamBbpWIiIwytY3N3WHNlaVqYP+hVsBtmjslK/Gowu+TMxOJ1Ka5/TKgcGaMyQQuxIWx84BE79KvgSeBt7o2qQ2kkAhnXVY9BE9/E5Lz4fOPQPqUQLdIRERGMWst1Q3NlFbUH9XL1uhtmhsVEcb07CRvSw83h21iRgLh2jT3Yw1kztkHwGxgLfAq8CbwNrCVHltqBIOQCmcA5cvh0Wuh7QhcthSmXhToFomIiHSz1rJr32HKqhq6a4muq2qkqcUFttjIcIpykrxVom4fNlU58BtIOHsM11vWgQtmb3g/XwRKrLUVg9/ckxNy4QygoRIe+QLsXgNzvwTn/wiiEwLdKhERkV51dlo+3HuouxxVWWUD66uPrnJQlOP1sOW5OWxjx8SNyk1zBzqsGQ4swg1rXoybZwawDPgb8Jy1tnbQWnuSQjKcAbS3wCs/gnfugpRC14uWf0qgWyUiItIn7R2dbN9zqHtLj7KqBjbsbqS13VU5SIqJoDjP7dtWkuv2YctLCf2yVIO6WrNrhaZ3LAYirbUBX1YYsuGsy8634a9fgcZKWHQrnPUdiIgKdKtERET6ra3DVTlYV9W1aW4Dm2oaaetwmaSrLFXXPmwzcn3kJodWYBvIsOYrx3tdXIWAsI978R6vcx8wHXjGWvuj/tzjLUh43lo7+3jvEfLhDKC5EZ7/Lqz5I2TPhM/+DjKmBbpVIiIiA9bS3sGWmiZKq/x7sG2pPUi7V5YqNT6qO7AVewsPsn0jt47oQMo3LfZ+dgDvAiuBdUCfV2caYy4Dwq21C40x9xtjJllrt/bjnp8BsX19v5AWkwSf+TVMuRCe+gb8dhEsvBnO/FfNRRMRkREtOiLcha48H5zqzjW3dbCp5iBlPYZE39q2t0cd0Z6BzW2em5kUPWIDW5cThbN8YCYwy/t5EfBlXEBb2eM4nsXAY97jF3Dz17b25R5jzDnAIaDmBO8xuky7GAoWwEv/AW//EsqegE/+F0y7xG3xLCIiEgJiIsOZlZ/MrPzk7nNHWl0d0a4h0XVVDby+ZQ9eXiM9Mdof2Lxh0YykmMB8gJN03HBmra0CqoBnAYwxWcBpwHXAV73b6oHj7ZQa770GwH5gTl/uMcZEAf8GfBa38OAjjDE3AjcCFBQUHO+jhJ74NLj01zD7i/DMrfDYF2HiuXDhT2HMhEC3TkREZEjERoUzd2wKc8emdJ873NrOhurG7m09yiobeG1zXXdgy+gKbHn+0BbMge244cwY83mO7jmLBFbhesv+DKy01m4/wXs04R+WTAB620K4t3tuA+6x1tZ/XPektXYpsBTcnLMTtCM0FZwKN74OH9wLr/wY7lnohjoX/W+I8QW6dSIiIkMuLiqCeYWpzCv09xV1Bbau3rXSqgZe2VyHHQGB7UQLAjoBC3TiNp/d4V066knW2n86zmt8Eciw1v7MGPMDYLO19uET3QN8xXtfcOHwCWvtDR/3PqNiQcCJHKyBF/8dSh+F2FQ4619h3j9BRHSgWyYiIhJwh1ra2bDbH9jKqhrYvqepO7BlJrnAdnFJDp+ZnTukbRnIas3bOSaI9cZa+4PjvEYSbuPal3FloK4GrrTWfv849yyw1jb0uP6atXbx8dqgcNZD9RoX0na8Dslj4RP/DkWXQZjqnomIiPTU1OIfEu0KbBcUZfIvF0w98ZMHYFD3OTvJBqTgKg28Ya3tdXJ/X+45HoWzY1gL21+GF2+H2jLIngWf+DeY8AktGhARETkOa+2Qr/gMeDgbDgpnH6OzE8oec1UGGiogdx4s/i5MVEgTEREJlOOFM41zhbqwMJh5NdyyCi7+BTTVwp8uh99/Ara+CCESzkVEREKFwtloEREF877UI6TtgT9dAfeeAxufdj1sIiIiEnAKZ6NNd0hbCZ/+JRzeC49+Ae45FVY9BO2tgW6hiIjIqKZwNlpFRMHc6+GW1XDZ7yE8GpZ9HX5ZAm//ytXxFBERkWGncDbahUdAyZXwlTfh2r/AmInw4r/BnTPghX+D+opAt1BERGRUUTgTxxhX/un6p+HLr8DEc+DdX8MvZ8JjS6B8uRYPiIiIDIMTFT6X0Sh3Llz5ADRUwvv3wsoHYMPfIGcOLPgqTP+MGxYVERGRQad9zuTEWg/B2j/De7+FfVshPh3mLHELC3x5gW6diIjIiKNNaGVwdHbCh6/A+7+HLc+7odApF8H8G2D8Ym1qKyIi0kfHC2ca1pS+Cwtz89ImngsHdsHK/4FVf4BNT7uFBHO/BDM/D/FjAt1SERGREUs9ZzIwbc1uPtoH90Hl+xAeBdMvddt0jD1dvWkiIiK9UM+ZDJ3IGFceaubVULveLR5Y+yiUPQ5jJsHcJVByNSSkB7qlIiIiI4J6zmTwtR52vWkr/sf1poVFwJQLYfYXXcH1sPBAt1BERCSg1HMmwysqDmZd4466jbD6j26158anIDEHZn0eZl8LqeMD3VIREZGgo54zGR7trbDlORfUtr0EthMKTnMBrugzEJ0Y6BaKiIgMG22lIcGloQpKH4U1D7t90yJiYfolLqgVnulWhYqIiIQwhTMJTtZC5QpY8ydY9yS0NEBSnqv1WXI1ZEwNdAtFRESGhMKZBL+2I7D5WVj7CGx7GWwHZM90Ia34CkjICHQLRUREBo3CmYwsTXWw7i8uqO1eAyYcJpwNxZ+DqRdpfpqIiIx4Cmcycu3Z7EJa2RPQUO7mp029CIqvhAmfUAF2EREZkRTOZOTr7HR7ppU+Buv/Ckf2Q2yKq0Yw43JXjUD7p4mIyAihcCahpaMNtr/igtrmZ6HtMCRkQdFnXVDLm6eyUSIiEtS0Ca2ElvBImHyBO1oPwZZ/uDlqK+6D5b+B5AIX1Io+C9mzFNRERGREUc+ZhI7mBtj0jAtqH74Gne2QMs4f1LKKFdRERCQoaFhTRp/D+2HT025+2oevu605xkx0c9Smf0ZBTUREAkrhTEa3Q/tg01Nuo9udb7mgljLOC2qXQs5sBTURERlWCmciXQ7tcz1qG/4OO153Q5/JBTDtEpj2acg7ReWjRERkyCmcifTm8H7Y/Bxs+Jubo9bRCgmZMPViF9QKF7nFByIiIoNM4UzkRJobYesLsHEZbH3Rbc8RkwxTLoSpn3Ib3kbFBbqVIiISIrSVhsiJxCS5Gp7FV7g6n9tfgQ3LXM/a2j+7ygQTzoFpF8PkT0JcaqBbLCIiIUrhTORYkbGut2zqp9yGt7vecfPUNj0Dm59xtT4LFnq9ahdB6vhAt1hEREKIhjVF+spaqF7thbRnoW6DO58+zT/8mTNHCwpEROSENOdMZCjs3+GGPTc/63rXbAfEZ7jKBVMuhPGLISo+0K0UEZEgpHAmMtQO73cLCbY8B9tehpZGCI+G8We5OWqTLwBfXqBbKSIiQULhTGQ4tbdC+Tuw+XkX1g7sdOczZ7iQNukCV5w9LDygzRQRkcBROBMJFGth7xZXnH3LP6D8XTf8GZsKk86DSee7VaBa/SkiMqpoKw2RQDEG0qe44/RvwJF62P4ybHkBtr0IpY+CCYO8+f6wllWiclIiIqOYes5EAqWzA6rXuM1vt74A1avc+YRMt+ntpHNh/NnqVRMRCUEa1hQZCZrqYNtLbmHB9legud71quXOg4nnuiNnluaqiYiEAIUzkZGmswOqVvrDWvVqwEJsiutNm/gJ17uWlB3oloqIyElQOBMZ6Q7tdcXZt73s5qw11brzGdPdgoIJ58DY01x1AxERCXoKZyKhxFqoXe9C2raX3QrQjla3r9rYhS6ojT/bbd2hagUiIkFJ4UwklLUedvuqbX/VzVXrKisVl+aqFHQdyfkBbKSIiPSkrTREQllUnH/BAEDjbjcE+uFr8OGrsO4Jd37MRBfSxp0F485w89dERCToqOdMJJRZC3s2uV61D1+DnW9B2yHAQPZMV15q3FlQsNCFPBERGRYa1hQRp73VrQLd8Tp8+DpUfgCdbRAeBXmnwLgz3ZE7FyKiAt1aEZGQpXAmIr1rPQS73oUdr8GON2H3WsBCZJzrTRt3BhSe6XrZwjULQkRksGjOmYj0LireVSKY5M1XO3IAdr4NO95wx0u3e/clupWghWdA4SIX1rQZrojIkFA4ExG/2BSYdrE7wFUt2Pmmm6u2401XZgog2ueFtUUw9nRXD1Q9ayIig2JY/jU1xtwHTAeesdb+qC/3GGN8wCNAOHAIuMpa2zoc7RURT0IGzLjcHeBWgu7yetZ2vQ1bnnfno5PcMGjh6TB2EWSXQHhk4NotIjKCDXk4M8ZcBoRbaxcaY+43xkyy1m490T3AecAd1toXjTG/AT4JLBvq9orIcSRlQ/EV7gB/WNv5lju2/sOdj4yHglNd1YKxp3sLDKID124RkRFkOHrOFgOPeY9fABYBW090j7X2nh7X04G6oWuiiJyUY8NaU50X1t52P1/xOsrDoyFvngtrBQsh/xSITgxcu0VEgthwhLN4oMp7vB+Y0597jDELgRRr7XvHPskYcyNwI0BBQcEgNllETkpCBhR91h0Ah/fDrnfcUf4OvPlzsJ1gwt3QZ8Fpbu5awUKITwts20VEgsRwhLMmoKsacwLQW7G/Xu8xxqQCdwGX9/bC1tqlwFJwW2kMXpNFZFDEpR69wKDlIFS874W1d+GD38N7v3bX0iZDwQIX2AoWQEohGBOwpouIBMpwhLOVuKHM94CZwOa+3GOMiQIeB75rrd01DO0UkaEWnQgTP+EOgPYWqF7jetV2vQsb/g6r/uCuJWS5eWsFC11YyyzWilARGRWGfBNaY0wS8CbwMnAhcDVwpbX2+8e5ZwFwDfCfwFrvtt9Yax/9uPfRJrQiIaCzE/ZshPL3/EdDubsWGQ95cyF/gQttefMhxhfY9oqInKSAVwgwxqTgVl++Ya2tOdl7jkfhTCRENVRBRY+wVrvOzVvDQMZ0F9TyF7hFBhoKFZERIuDhbDgonImMEi1NULUCype70FbxAbQedNfi0yH/VBfU8k+F7FkQGRPQ5oqI9Eblm0QkdEQnwPjF7gDo7IA9m6BiuVtsULEcNj3troVFulWheadA/nz305en3jURCWrqOROR0NO0Byrfd2Gt8gOoWgXtR9y1xBy351refNfDlj0TImOP/3oiIoNMPWciMrokpMPUT7kDoKMNaspcUOsKbBu9giNhkZBV7MJa3nwX3DR3TUQCSD1nIjI6NdW5kFb5gZu3Vr0K2g67a3FpXu/aPMidB7lztDJURAaVes5ERI6VkHFM71o71G1wiw0qV7jQ1lXYHeM2yc2b5+qE5s2DjCLtuyYiQ0I9ZyIiH+fIATdfrWqlC2xVK+DwPnctItbNV8vzetZy50LyWA2HikifqOdMRORkxKYcXdHAWjiw04W1ruOD38O7ze56XJoLad3HHFfCSkSkHxTORET6yhhIHeeO4ivcuY42qF3vDYeudHPXtr4AeKMSKYUuqOXMcWEteyZExQfqE4jICKBwJiIyEOGRkDPLHfNvcOeaG2H3Wn/vWvlyWPcXd82EQfpUL6zNdj8zZ0BEVKA+gYgEGYUzEZHBFpME485wR5eDta5XrWqV+7n5WVjzR3ctPMoFtNw5kOMFtvQpEBYemPaLSEBpQYCISCB0zV+rXu3CWvUad3SVooqMc0OgObP9R+oECAsLYKNFZLBoQYCISLDpOX9txmXuXGcn7NvWI6ytghX/A+33uOvRSV5gm+XqhubMhtTxWiEqEmIUzkREgkVYGKRPdsfMq925jnbYu9nrYVvtQtvypdDR4q7H+Fxgy57lD20KbCIjmsKZiEgwC4+AzCJ3zL7Wnetog7qNLqztXuN+Lv8tdLS669E+V/C9Zw9byjgNiYqMEApnIiIjTXikC1/ZJcASd669FfZs9Peu7V4Dy3/XI7B5Q6I9e9k0h00kKCmciYiEgogof/ia653rCmy71/oD2/v3+odEoxJc0ffsWf7npk1WWSqRANPfQBGRUNUzsM35ojvX0QZ7NrvAtnuN+7nqQX/R94gYt61Hdy/bTMiYBhHRAfsYIqONttIQERntOju8VaJroKbUC25roaXRXQ+LhIypLqhleYEta4YqHYgMgLbSEBGRjxcW7ja9TZ8CM69y5zo7oX7n0YFt83Ow2ts4FwNpkyDLm/uWPdM9Vi1RkQFTOBMRkY8KC3NbcqSO9+/DZi00VvfoXSuF8vdg3RP+5/ny/YGt62dSrrb2EOkHhTMREekbY8CX644pF/rPH9rnD2w1pS60bX6W7uLvsaleWCv2hkVLYMxElacS+RgKZyIiMjDxY2DC2e7o0tIEteuPDm09t/aIiHV7t/UMbRnTICouMJ9BJIgonImIyOCLToCCU93RpWulaE2ZC2s1ZVD2F1hxv7tuwmDMpB6BrdgNjcanBeYziASIwpmIiAyP8Ei3yjNrBvB5d85aqC8/OrCVvwdlj/ufl5jdI6x5gU0VDySEKZyJiEjgGAMpY90x7WL/+cP7vcDW49j2MtgOdz0y3g2L9gxsGhaVEKFwJiIiwScuFcaf5Y4ubc2u4kHNOn9gK30MVtznrpswt9Agc8bRPW0JmVotKiOKwpmIiIwMkTGuiHvObP+5zk6o3+WCWu06F9wqV8D6J/33xKW5odTMGa6HLWuGV6Yqcvg/g0gfKJyJiMjIFRYGqePcMf0S//kjB7zVouug1utl61lXNDzKbbqbVeKFNi+8aRNdCQIKZyIiEnpiU6BwkTu6dLTDvq3+IdHadbD1RVjzJ/89Sbk9wloRZBbDmAnak02GlcKZiIiMDuERbtFAxjQo+Zz/fFNdj8C23oW2bS/5Fx9ExLrndC1AyPSCW2xyQD6GhD6FMxERGd0SMmDiJ9zRpb0F9mzyhkW9Y9MzsPoh/z2+fH9Q6wpuqePVyyYDpnAmIiJyrIhoV8w9e6b/nLVwsMYf1rqC29YXeu9l6xncNJdN+kHhTEREpC+MgaRsd0w6z3++rRn2bvbC2nq3AGHzs0f3siXl+oNaV2gbM1ErRqVXCmciIiIDERnTey9bU63Xy7bev3J0+6vQ2ebu6Vox2rOHLXOGG2aVUU3hTEREZLAZA4lZ7ph4rv98e6u3YnSdP7htfwXW/tl/T3w6ZEzvEdqmQ/pUiIwd/s8hAaFwJiIiMlwiovy9ZFzlP39oH9St968WrV3vCsK3H3HXu6ofdIe26e41fAWqMRqCFM5EREQCLX4MjDvTHV06O2D/DhfW6ja4wLZ7DWz4m/+eqAQvsE2HjCJ/T1tsynB/AhlECmciIiLBKCwc0ia6o+gz/vMtB6FuU4+etg2w/m+w8gH/PYk5/t61DC+wpU12q1Al6CmciYiIjCTRiZA/3x1drIWDu11Q6xnadrwBHa3unrCIHkOj0/2hTUOjQUfhTEREZKQzBpJy3DGpxwKEjjbYt82FtboNLrBVHVMYPirBq5zQ1dM2XXuzBZjCmYiISKgKj/SXrOqpudFVQOgZ2jYug1UP+u9JyDw6sGVMc6tGo+KG9zOMQgpnIiIio01MEuSf4o4u3Xuz9QhsdRvgg99De7N3k4HUcV5Ym+6vhpA6wdUulUGhP0kRERE5Zm+2HnVGu1aN1m3wrxqt2+iqINhOd094FKRN8cJaj+Dmy3evK/2icCYiIiIfr+eq0emX+M+3HYE9m11Qq9vgfu56B8oe898TlegfVu1eiDAd4tOG/3OMIApnIiIi0n+RsZAzyx09Hal3QW3PRvezt/ls8en+wJY+1etpmwoxvmH8AMFL4UxEREQGT2wyjF3oji7WQlOd2+ajbpO/p23VQ9B2yH9fUt7RPW0Z01z90VFWukrhTERERIaWMZCY6Y4J5/jPd3ZCQ4U/rHUdO17378/WtQghfVqP4DYNxkxy5bBCkMKZiIiIBEZYGKSMdceUC/3nO9rhwA63+GDPJn9o2/I82A7vuRFulWjG1B7Do9MgdbzbQmQEUzgTERGR4BIeAWmT3NFTe4vbVLdnL1tNGWxYBlh3T1ikK1WVMdXrbfPCW0qhW9wwAgxLODPG3AdMB56x1v6or/f05XkiIiIySkREe8Xdi44+33oY9m7psRBhE1R8AOv+0uO5MS7sdQW2dG8+W/LYoNujbchbY4y5DAi31i40xtxvjJlkrd16onuA4hM9T0RERISouN5XjrYchD1b/CtH92z66HYf4VFuKDRtkpvHljYZcue44BYgwxEVFwNdfwovAIuAY0NWb/fMPtHzjDE3AjcCFBQUDG6rRUREZGSLToS8ue7oqbnR7dG2dzPs3eqOuk2w+TnobIf5N8Cnfh6YNjM84SweqPIe7wfm9PGeEz7PWrsUWAowb948O3hNFhERkZAVkwT5893RU0cbHNgZ8AUFwxHOmoCuDUoSgLA+3tOX54mIiIgMjvDIjy5CCIDhCDwrcUOSADOBnX28py/PExEREQkpw9Fz9jfgTWNMDnAhcLUx5kfW2u8f554FuDWxx54TERERCWlD3nNmrW3ETfh/DzjbWrv2mGDW2z0NvZ0b6raKiIiIBNqwbOxhrT2Af+Vln+/py/NEREREQokm2YuIiIgEEYUzERERkSCicCYiIiISRBTORERERIKIwpmIiIhIEFE4ExEREQkixtrQKElpjNkD7BrEl0wD9g7i60lw0PcamvS9hiZ9r6FJ36sz1lqb3tuFkAlng80Ys8JaOy/Q7ZDBpe81NOl7DU36XkOTvtcT07CmiIiISBBROBMREREJIgpnH29poBsgQ0Lfa2jS9xqa9L2GJn2vJ6A5ZyIiIiJBRD1nIiIiIkFE4UxEREQkiCic9cIYc58x5l1jzPcD3RY5ecYYnzHmOWPMC8aYvxpjovTdhg5jTKYxZrX3WN9riDDG3GOM+bT3WN/rCGeMSTHGPGuMWWGM+Z13Tt/rCSicHcMYcxkQbq1dCIw3xkwKdJvkpH0BuMNaez5QA1yNvttQ8jMgVn9nQ4cx5gwgy1r7lL7XkHEd8CdvX7NEY8y/ou/1hBTOPmox8Jj3+AVgUeCaIgNhrb3HWvui92s6cC36bkOCMeYc4BAudC9G3+uIZ4yJBO4FdhpjLkXfa6jYB8wwxiQD+cA49L2ekMLZR8UDVd7j/UBmANsig8AYsxBIASrQdzviGWOigH8DbvNO6e9saPgisAH4KXAKcDP6XkPBW8BY4BvARiAKfa8npHD2UU1ArPc4Af0ZjWjGmFTgLuCf0HcbKm4D7rHW1nu/63sNDbOBpdbaGuCPwBvoew0F/wF8xVr7f4FNwDXoez0h/aF81Er83awzgZ2Ba4oMhNfD8jjwXWvtLvTdhopzgZuNMa8Bs4BPo+81FGwDxnuP5wGF6HsNBSlAsTEmHDgV+G/0vZ6QNqE9hjEmCXgTeBm4EFhgrW0IbKvkZBhjvgr8J7DWO/U/wK3ouw0ZXkC7BP2dHfGMMYnA/bhhrkjcAp5l6Hsd0Ywxp+D+7R0LvAtcjv6+npDCWS+MMSnAecAbXhe7hAh9t6FJ32to0vcamvS9npjCmYiIiEgQ0ZwzERERkSCicCYiIiISRBTORGTEMca8Zoy5frifKyIyHDTnTESGhDHmAWCntfb2IXjtBKDVWts6nM8dKsaYncD11trXAtwUEQkCEYFugIhIf1lrmwLxXBGR4aBhTREZVMaY3xtjLLAE+A9jjDXG1PS4XuidS/bu3WOMKepx/RpjzBZjzBFjzGqv/Nax7/GRoUljzO3GmAeMMbcaY2qMMQeMMbcPxnONMWHGmF9559cbY37i3XdWH/48fMaYR73nHjDGPGiMifGubfP+rMYCr3p/Lo8c89x7jTG1xpgKY8y3jmnzM8aYfxhjGo0xy40x8/ryviIS3BTORGSw3YLbFfzPwE+8x5N7ue/vwB7gCrxdwo0xE4GHcLuIjwP+Cvy+H+/9Sdz+SWcBXwf+3RgzbhCee613fi6uHNgS3O7mK/rwut/BlSZaAJwOzAe+6l2bjb/u66e9x//U47l/8O45y3vPHxpjLutx/SLgKaAYVwFjmTdse6L3FZEgpmFNERlU1tojwBFjTCvQ3KMG5rHesNb+2zHnKoAcoAEXftKAqf14+3DgKmttI7DZGPMzoADYMcDnngo8Z6390JtL9xvcnN1DfXjdQ4DBFXxeD8zoumCtPQhgjOkEmnr+WRljsnDVD86z1m4CNhljngKuBJ70bnvPWnu3d/+3gRuAM4Dnjve+IhLc1HMmIoHyk17ORQF3ALXAPUAS/ft36m0vXHVpwQWUgT53O3C6MSYaOMdrX20fX/cXuF7CJ4F9uKLeGX14XoH38y/GmHpjTD1wKa7mZJedXQ+stYe9188e4PuKSIApnInIUOnkOMHoYybmfxNXzDzfWjsX+H/9fM/6ft7f1+duBIqAg7hh1y/avi91nw78ylo7yXs8lo8G097+rHZ5Py/E/ZnMwvUmXt/jnoldD7zhzDSgqh/vKyJBSOFMRIbKZuAcY0yOMabEGNPbvLNjJeL+XUoxxpwGPAhgjOlr79dQ+S7wLVw4GmetfaEfz70FuM8YUwxEe+eO/bd3M/ApY0yWMeYsY0yStbYW1/P1Ve9+H27+3Q96PG+eMeYbxpixwM9xvXlv9uN9RSQI6S+qiAyVu4E6YCvwKjChD8+5A9gNbADuBX6H61WaO0Rt7Ku/4hYCfAA0eKsfb+vjc/8FN4fuNWAdrvftu8fc803gTKAcF0hjvfPX44ZX3/WevwP4So/n/R04HyjD9axd4g1v9vV9RSQIaRNaEZHjMMYk4kLTxcAm3Ly4LwLfttamB7BdtwOF1trrA9UGERkaWq0pInIc1tqDxpjf4CbUZwMduJ6ofzruE0VETpJ6zkRERESCiOaciYiIiAQRhTMRERGRIKJwJiIiIhJEFM5EREREgojCmYiIiEgQUTgTERERCSL/H2sfE249vInEAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 720x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.rcParams['font.sans-serif']=['SimHei']\n",
    "plt.rcParams['axes.unicode_minus'] = False\n",
    "\n",
    "plt.figure(figsize=(10,5))\n",
    "x=np.arange(1,len(train_rmse_lst)+1)\n",
    "y_train_mae_lst=train_mae_lst\n",
    "y_validation_mae_lst=validation_mae_lst\n",
    "plt.plot(x,y_train_mae_lst,label=\"train\")\n",
    "plt.plot(x,y_validation_mae_lst,label=\"validation\")\n",
    "\n",
    "plt.xlabel(\"training steps\",fontsize=15)\n",
    "plt.ylabel(\"MAE\",fontsize=15)\n",
    "plt.legend(fontsize=15)\n",
    "plt.savefig(\"E:/推荐系统/图片/BiasLFM_MAE.png\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "24abb7c3",
   "metadata": {},
   "outputs": [],
   "source": [
    "result_bias_svd=pd.DataFrame({'TrainRMSE':train_rmse_lst,\n",
    "                        'TrainMAE':train_mae_lst,\n",
    "                        'ValidationRMSE':validation_rmse_lst,\n",
    "                        'ValidationMAE':validation_mae_lst})\n",
    "result_bias_svd.to_csv('E:/推荐系统/图片/result_bias_svd.csv',index=False)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
